使用node-validator一次验证多个属性

时间:2013-12-17 00:20:41

标签: node.js express

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

假设我的JSON有效负载是:

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

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

我已经设置了一个基本的Node.js实例ExpressValidator,以便完成此任务:

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),但e上的catch不适用不包含有关验证失败的属性的任何细节 - 如果我设置了多个检查,我不知道哪个失败或为什么。

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

2 个答案:

答案 0 :(得分:2)

尝试express-validator提供错误处理,如:

var errors = req.validationErrors();

答案 1 :(得分:0)

使用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});
}

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