如何在每个路由的基础上将参数传递给通用Express中间件函数?

时间:2017-09-11 02:32:41

标签: javascript node.js express routes

我编写了一个通用验证函数,它将一个对象作为第一个参数,其属性required(以及其他)是一个字符串数组。它用于根据required中找到的任何密钥测试传入的前端数据。这是一个看起来如何的模型 - 使用下划线来检查isEmpty

validator.js

function validateRequest(options, req, done) {
  const { body } = req;
  const { required } = options;
  const errors = {};

  if (required && required.length) {
    required.forEach(key => {
      const value = `${body[key]}`;

      if (_.isEmpty(value)) {
        errors[key] = 'This field is required';
      }
    });
  }

  if (_.isEmpty(errors)) done({ success: true });
  else done({ success: false, errors });
}

我目前正在使用它:

路由/ auth.js

router.post('/login', (req, res, next) => {
  validator.validateRequest({
    required: ['identifier', 'password']
  }, req, result => {
    if (!result.success) return res.status(400).send(result);
    next();
  });
}, auth.login);

我希望能够以更清洁的方式使用它,更像是:

router.post('/login', validator.validateRequest({
  required: ['identifier', 'password']
}), auth.login);

我宁愿不使用app.use,因为它让我不得不担心总是将它放在路径文件的适当层次结构中,并且在我需要它的意义上是不可扩展的。我还有其他参数作为options传递,验证输入为数字,正确的邮政编码等,所以上面的函数比例子更深入。有没有办法让我在逐个路线的基础上使用这样的东西?我的中间件函数必须能够拦截(req, res, next),而不必每次都写出来......对吗?

1 个答案:

答案 0 :(得分:0)

答案是使用更高阶函数返回一个函数,该函数将router.post('/login', validateRequest({ required: ['identifier', 'password'] }), auth.login); 作为参数,如下所示:

<强> validator.js

{{1}}

然后可以这样使用:

<强>路由/ auth.js

{{1}}