12

我想创建一个看起来像这样的快速中间件:

function validate (options) {
  var defaultOptions = {...}
  , validations = _.extend(defaultOptions, options);
  return validate (req, res, next) {
      /* Use some sort of validation framework where I can pass `validations` into*/



      next(someErrors || null)
  }    
}

我已经查看了带有中间件选项的节点验证器以及tracery,但它们看起来都不像您可以将“规则集”传递给它们并让它们根据提供的输入运行规则。

有人对如何使用这些模块中的任何一个或我尚未找到的另一个模块有任何建议吗?我是否必须自己动手才能做到这一点?

更新

这确实是为了验证表单帖子。我知道不会有一个中间件可以覆盖整个站点的所有帖子。这将仅用于某些路线。我想要可重用的中间件,因为我们正在制作具有公共路由的 API,并期望我们希望以类似方式验证的公共表单主体,并可以选择在每个 API 的基础上对其进行调整。

4

3 回答 3

4

使用 JSON 模式

在不了解您要检查的具体内容的情况下,我认为基于JSON 模式的工具可以很好地为您服务。JSON 模式指定了多种验证规则

节点模块示例:

我根据在 Nipster 上对“json schema”的简单搜索制作了这个列表。我发现 Nipster 是一个很好的工具,可以快速了解特定任务的优秀模块,因为它还包括项目的分叉数量和 github 星号作为流行度的衡量标准,这反过来又经常说明模块的质量和成熟度. 当然不能盲目,而是作为进一步研究的开始。

我希望实际上并非 JSON 模式的所有模块都支持所有验证规则,所以我认为您应该首先列出您实际需要(或希望将来可用)的规则类型,然后根据您的选择范围缩小在那。

JSON 模式工具有一个官方测试套件。您可能需要寻找宣传此套件合规性的模块。

不使用 JSON 模式

于 2013-05-29T16:48:20.540 回答
3

您可能想要使用这样的模式:

function validateRegForm(req, res, next){
  console.log('Validating form...');
  if(!req.body.password){
    return res.send(500, 'Need a password');
  };
  next();
};

app.post('/regForm'
, validateRegForm
, function(req,res){
  // If Express calls this fn, the previous fn did next(), not res.send()
  console.log('Doing something with this valid form');
  res.redirect('/regForm/complete');
});
于 2013-06-01T19:27:02.317 回答
0

我知道这已经过时了,但是对于那些正在寻找一种验证传入请求主体以及标头、路由参数和查询参数的好方法的人,请查看https://github.com/continuationlabs/celebrate

它利用 Joi 来验证参数,该参数具有声明式的重用和扩展验证规则。

于 2017-09-04T14:40:44.777 回答