我正在构建一个Node.js代理,目的是处理单个POST
请求并将有效负载重定向到两个不同的端点。
假设我的JSON有效负载是:
{
"owner":"0ce856fa-f17f-11e2-9062-9b7910849bf4",
"comment":"My super cool comment!",
"photo":"0928536a-53c4-11e3-ba86-4b026f27c637"
}
我需要在发送之前在代理端点上验证此有效负载;这三个属性中的每一个都必须存在,owner
和photo
必须与下面的正则表达式匹配。如果他们没有通过验证,我需要处理错误并使用适当的错误代码将消息返回给用户。
我已经设置了一个基本的Node.js实例Express和Validator,以便完成此任务:
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
,但这看起来像是结束验证,我不清楚如何(如果可能的话)将其与服务器端代码集成。
答案 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});
}
这可以完成工作,并根据标准验证每个属性。