在Express Middleware中提供自定义参数

时间:2016-08-17 19:09:17

标签: javascript node.js function express middleware

我的Node.js应用程序出了问题。简而言之,我想将自定义参数传递到我的中间件功能,而不仅仅是reqresnext

中间件文件:

var DB = require('./DB.js');

function requirePermissions(e) { 
    console.log('nope')
}

module.exports = requirePermissions;

路线:

router.post('/posts', requirePermissions('post_creation'), function(req, res)       {
  var   o       = req.body,
      title   = o.post.title,
      content = o.post.content;

  res.send('made it');
});

我已经确认使用函数requirePermissions(req, res, next) {}会有效,但我不明白如何包含我自己的参数。

2 个答案:

答案 0 :(得分:2)

您的函数requirePermissions应该返回另一个将成为实际中间件的函数:

function requirePermissions(e) {
  if (e === 'post_creation') {
    return function(req, res, next) {
      // the actual middleware
    }
  } else if (e === 'something_else') {
    return function(req, res, next) {
      // do something else
    }
  }
}

您也可以这样做:

function requirePermissions(e) {
  return function(req, res, next) {
    if ('session' in req) {
      if (e === 'post_creation') {
        // do something
      } else if (e === 'something_else') {
        // do something else
      }
    }
  }
}

答案 1 :(得分:1)

您可以为中间件创建一个匿名函数,让您通过一些额外的参数调用实际函数:

router.post('/posts', function(req, res, next) {
      requirePermissions('post_creation', req, res, next);
   }, function(req, res) {
      var o   = req.body,
      title   = o.post.title,
      content = o.post.content;

      res.send('made it');
});

或者,您可以使用.bind()预先建立参数:

router.post('/posts', requirePermissions.bind('post_creation'), function(req, res) {
      var o   = req.body,
      title   = o.post.title,
      content = o.post.content;

      res.send('made it');
});

这将使用以下四个参数调用requirePermissions()函数:

requirePermissions('post_creation', req, res, next)