【问题标题】:Express Req.Body ValidationExpress Req.Body 验证
【发布时间】:2013-05-23 15:14:37
【问题描述】:

我想创建一个 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-validatortracery,但它们看起来都不像您可以将“规则集”传递给它们并让它们根据提供的输入运行规则。

是否有人对如何使用这些模块或我尚未找到的另一个模块执行此操作有任何建议?我必须自己动手吗?

更新

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

【问题讨论】:

  • 也许我的速度很慢。我的第一印象是这是为了验证表单帖子,但我并没有真正看到应用程序范围的中间件是放置该逻辑的正确位置。您是否尝试检测 CSRF 攻击?

标签: node.js validation express middleware


【解决方案1】:

使用 JSON 架构

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

节点模块示例:

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

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

有一个official test suite for JSON schema tools。您可能需要寻找宣传此套件合规性的模块。

不使用 JSON 架构

【讨论】:

  • 我知道 JSON 模式验证,但这并不是我真正想要的。我正在寻找做简单的 JS 对象验证。我也不是 JSON 模式验证规范的忠实粉丝,因为我发现人类很难阅读。
  • 你应该在你的问题中提到这一点。它会节省我的工作。使用Orderly 作为基本语法怎么样?你可以试试zaach.github.io/orderly.js
  • 现在有一个项目可以在 Joi 中插入 json 模式,名为 enjoigithub.com/tlivings/enjoi
【解决方案2】:

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

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

【讨论】:

  • 我认为这是“自己动手”,我真的很想避免这样做。这就是现在的情况,我正在努力清理它。
  • 我不知道向特定路由添加可重用中间件功能的低开销方法。在某些时候,您将不得不编写代码以不同方式处理不同的验证情况。无论您是自己推出还是找到一个库,这种模式对于允许您在不同的路由上重用这些验证函数可能仍然有用。 gl
  • 我认为这是一个很好的答案。您正在谈论的规则集可以建模为 if-else 阶梯或条件表达式。你只需要把它们放在你自己的中间件中,就可以了。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2016-11-17
    • 1970-01-01
    • 2019-02-08
    • 2016-02-15
    • 2020-12-17
    • 2021-11-03
    • 1970-01-01
    • 2020-01-08
    • 2017-08-30
    相关资源
    最近更新 更多