nodejs表示中间件函数的返回值

我使用node.js和express,我有以下路由和中间件functionisMobile。 如果我不使用return next(); 在isMobile函数中,应用程序被卡住,因为nodejs不会移动到下一个函数。

但我需要isMobile函数来返回一个值,所以我可以在app.get中相应地处理。 有任何想法吗?

app.get('/', isMobile, function(req, res){ // do something based on isMobile return value }); function isMobile(req, res, next) { var MobileDetect = require('mobile-detect'); md = new MobileDetect(req.headers['user-agent']); //return md.phone(); // need this value back return next(); } 

谢谢

你有几个select:

  1. 将该值附加到req对象:

     app.get('/', isMobile, function(req, res){ // Now in here req.phone is md.phone. You can use it: req.phone.makePrankCall(); }); function isMobile(req, res, next) { var MobileDetect = require('mobile-detect'); md = new MobileDetect(req.headers['user-agent']); req.phone = md.phone(); next();// No need to return anything. } 

    这是多less个快速/连接中间件传递值。 像附加body属性的bodyParser请求对象,或附加会话属性的会话中间件请求obejct。

虽然请注意,您必须小心,没有其他图书馆使用该属性,所以没有冲突。

  1. 不要把它作为一个中间件,直接使用这个函数。 如果它不像上面那样是asynchronous的,并且不会被全局用于所有的路由(不会有这样的事情: app.use(isMobile) ),这也是一个很好的解决scheme:

     app.get('/', function(req, res){ var phone = isMobile(req); phone.makePrankCall(); }); function isMobile(req) { var MobileDetect = require('mobile-detect'); md = new MobileDetect(req.headers['user-agent']); return md.phone(); } 

如果计算起来很昂贵,并且可能在多个中间件中使用它,则可以使用弱映射对其进行caching。

创build一个返回中间件的函数expression式:

 var isMobile = function() { return function(req, res, next) { next(); } }; app.get('/endpoint', isMobile(), ...)