您是否可以使用快速中间件检查特定于路由的配置?

时间:2016-07-02 04:20:40

标签: node.js express middleware

我有一个节点/快速项目,对于任何 POST 请求,我想验证请求正文中的字段。

为此,我想设置一个处理 POST 方法的路由配置,配置将有一个带有约束的字段列表,如下所示:

router.post('/some_path', function(request, response, next){
    this.fieldsToValidate = [
        {
            name: 'field_name',
            required: true,
            ...
        },
        ...
    ]
    // handle route after validation
}

我希望这是一个按路由配置,这样我就可以定义一组字段及其约束,并且它们将由中间件自动验证。

所以中间件看起来像:

function(request, response, next){
    if (request.method === 'POST'){
        this.fieldsToValidate.forEach(function(field){
            //do some validation
        });
    }
    next();
}

我了解中间件是在请求之前运行的,但有没有办法像这样使用每个路由配置并使用中间件验证它?

提前致谢。

2 个答案:

答案 0 :(得分:1)

这个怎么样:
使用express-validator(check in detail)和路由正则表达式检查你的参数,假设你的api都在 / api / *中:

服务器:

var expressValidator = require('express-validator');
app.use(bodyParser.json());
app.use(expressValidator());
app.use('/api',function(req,res,next){
    switch(req.baseUrl)
    {
        case ://API 1
          req.checkHeaders('user','valid header').notEmpty();
          break;
        case ://API 2
        //Others
    }
    var errors = req.validationErrors();
    if (errors) {
        res.send('There have been validation errors: ' + util.inspect(errors), 400);
        return;
    }
    next();
});

答案 1 :(得分:0)

express-validator node-validator的express.js中间件。我正在使用我的项目工作得很好。您可以进行验证和清理。

  // VALIDATION
  // checkBody only checks req.body; none of the other req parameters
  // Similarly checkParams only checks in req.params (URL params) and
  // checkQuery only checks req.query (GET params).
  req.checkBody('postparam', 'Invalid postparam').notEmpty().isInt();
  req.checkParams('urlparam', 'Invalid urlparam').isAlpha();
  req.checkQuery('getparam', 'Invalid getparam').isInt();

  // OR assert can be used to check on all 3 types of params.
  // req.assert('postparam', 'Invalid postparam').notEmpty().isInt();
  // req.assert('urlparam', 'Invalid urlparam').isAlpha();
  // req.assert('getparam', 'Invalid getparam').isInt();

  // SANITIZATION
  // as with validation these will only validate the corresponding
  // request object
  req.sanitizeBody('postparam').toBoolean();
  req.sanitizeParams('urlparam').toBoolean();
  req.sanitizeQuery('getparam').toBoolean();