【问题标题】:Using node-validator to validate multiple properties at once使用节点验证器一次验证多个属性
【发布时间】:2013-12-17 00:20:41
【问题描述】:

我正在构建一个 Node.js 代理,目的是处理单个 POST 请求并将有效负载重定向到两个单独的端点。

假设我的 JSON 有效负载是:

{
  "owner":"0ce856fa-f17f-11e2-9062-9b7910849bf4",
  "comment":"My super cool comment!",
  "photo":"0928536a-53c4-11e3-ba86-4b026f27c637"
}

我需要在代理端点上验证此有效负载我发送它之前;这三个属性中的每一个都必须存在,并且ownerphoto 都必须匹配下面的正则表达式。如果他们没有通过验证,我需要处理错误并将带有适当错误代码的消息返回给用户。

我已经用ExpressValidator 设置了一个基本的Node.js 实例,就像这样来完成这个:

var url = require('url');
var request = require('request');
var express = require('express');
var check = require('validator').check,
    sanitize = require('validator').sanitize;

var app = express();

app.use(express.json());
app.use(express.urlencoded());

app.all('*', function(req, res){
    if (req.method == "POST")
    {
        try {
            check(req.body.owner, {
                is: "<owner> property of type [uuid] is required"
            }).is(/\w{8}(?:-\w{4}){3}-\w{12}?/);
        } catch (e) {
            console.log(e);
            res.json({"result":"failed","message":"Your payload didn't pass validation"});
        }
    }
});

app.listen(9000, function() {
    console.log("Server initialized on port 9000");
});

问题:这一切都很好,而且非常适合单次验证(在本例中为 owner),但 catch 上的 e 不包含有关验证失败的属性——如果我设置了多个检查,我不知道哪一个失败或为什么失败。

如何设置一系列检查并检索我配置的自定义消息?它谈到在验证器自述文件中使用 req.onValidationError,但这看起来是前端验证,我不清楚如何(如果可能)将其与服务器端代码集成。

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    试试express-validator,它提供了如下错误处理:

    var errors = req.validationErrors();
    

    【讨论】:

    • 嘿,看起来几乎是相同的实现。六个中的一个/半打其他的?
    • 重点是不用try..catch就可以检查多个数据,所以你只能通过错误数据数组来控制你的数据流。
    • 啊,明白了。好的,我会试一试。
    【解决方案2】:

    更新,使用express-validator:

    根据@shawnzhu 的建议,我改为使用express-validator;需要进行一些调整才能使其与 express+connect 3.0 一起使用,但鉴于它可以处理 node-validator 错误,它看起来是最好的方法(尽管验证了 headers)。

    var express = require('express'),
        expressValidator = require('express-validator');
    
    var app = express();
    
    app.use(express.json());
    app.use(express.urlencoded());
    app.use(expressValidator());
    
    req.checkBody("owner", "<owner> property of type [uuid] is required; " + req.body.owner + " is invalid.").is(uuidRegex);
    req.checkBody("photo", "<photo> property of type [uuid] is required; " + req.body.owner + " is invalid.").is(uuidRegex);
    req.checkBody("comment", "<comment> property can't be empty").notNull().notEmpty();
    
    req.sanitize("comment").trim();
    
    var errors = req.validationErrors();
    if (errors) 
    {
        res.json({"result":"failed","errors":errors});
        return;
    }
    

    要让它与node-validator一起工作:

    导致问题的是内联消息验证:

    try {
        check(req.body.owner, "<owner> property of type [uuid] is required").is(/\w{8}(?:-\w{4}){3}-\w{12}?/);
        check(req.body.photo, "<photo> property of type [uuid] is required").is(/\w{8}(?:-\w{4}){3}-\w{12}?/);
        check(req.body.comment, "<comment> property can't be empty").notNull().notEmpty();
    } catch (e) {
        res.json({"result":"failed","message":e.message});
    }
    

    这会完成这项工作,并根据标准验证每个属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-29
      • 2013-01-17
      • 2014-10-18
      • 1970-01-01
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多