Express请求体验证

12

我希望创建一个类似于以下代码的Express中间件:

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)
  }    
}

我已经查看了node-validator(选择中间件选项)和tracery,但似乎都不能将“规则集”传递给它们,并让它们针对提供的输入运行规则。

是否有人有关于如何使用这些模块或其他未发现的模块来实现此功能的建议?难道我必须自己编写代码吗?

更新

确实要验证表单提交。我知道不会有一个单独的中间件可以覆盖整个站点的所有提交;这仅用于某些路由。我想要可重复使用的中间件,因为我们正在制作具有共同路由并期望具有类似验证方式的常见表单体的API,同时还可以在每个API基础上进行微调。


也许我有点慢。我的第一印象是这是为了验证表单提交,但我不认为整个应用程序的中间件是放置该逻辑的正确位置。您是在尝试检测CSRF攻击吗? - Richard Marr
3个回答

5

使用JSON schema

如果您不知道要检查什么特定内容,我认为基于JSON schema的工具可以很好地为您服务。JSON schema指定了许多种验证规则

以下是一些Node模块示例:

我根据在Nipster上搜索“json schema”得出了这个列表。我发现Nipster是一个很好的工具,可以快速概述特定任务的好模块,因为它还包括项目的分支数和Github星级作为衡量受欢迎程度的标准,这反过来通常也说明了模块的质量和成熟度。当然,不能盲目接受,但可以作为进一步研究的起点。

我预计实际上并非所有JSON schema模块都支持所有验证规则,因此我认为您应该首先清点您实际需要哪些规则(或未来想要有哪些规则),然后根据这些缩小选择范围。

有一个官方的JSON schema工具测试套件。您可能希望寻找宣传符合此套件的模块。

不使用JSON schema


我知道JSON模式验证,但这并不是我想要探讨的。我希望进行简单的JavaScript对象验证。而且,我不太喜欢JSON模式验证规范,因为我发现它对人类来说非常难以阅读。 - arb
1
你应该在问题中提到这一点。这可以节省我的工作量。使用Orderly作为基本语法怎么样?你可以尝试使用http://zaach.github.io/orderly.js/。 - Myrne Stol
现在有一个将JSON模式插入Joi的项目,名为enjoi:https://github.com/tlivings/enjoi - AdrieanKhisbe

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');
});

1
我认为这算是“自己动手做”,而我真的想避免这样做。目前就是这样,我正在努力整理它。 - arb
我不知道有什么更低开销的方法来为特定路由添加可重用的中间件函数。在某个时候,您将不得不编写处理不同验证情况的代码。无论您是自己编写还是找到一个库,这种模式可能仍然很有用,可以让您在不同的路由上重用这些验证函数。 - Plato
1
我认为这是一个非常好的答案。你所谈论的规则集可以被建模成if-else梯子或条件表达式。你只需要把它们放入你自己的中间件就行了。 - kumarharsh

0

我知道这已经有点老了,但是对于那些正在寻找一种验证传入请求正文、头部、路由参数和查询参数的好方法的人来说,可以看看https://github.com/continuationlabs/celebrate

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接