目前我正在使用Sails.JS实现一个应用程序。每次REST请求命中我的风帆控制器时,我都会手动(如果检查)检查验证,如果变量是否存在/是否存在有效数据类型。
是否有任何标准方法(自定义中间件可以根据预定义的JSON对象验证每个请求?)以验证参数是否超出我的控制器逻辑标题。
如何在生产使用的其他编程语言/框架中处理它?</ p>
提前致谢。 Prasad.CH
答案 0 :(得分:2)
Sails.js建立在Express之上,因此您似乎正在寻找像express-validator这样的快速中间件。您也可以将其与Sails策略一起使用,如waza007建议的那样。
答案 1 :(得分:1)
对我来说最好的解决方案是https://github.com/epoberezkin/ajv 它是一个JSON模式验证器 简短的例子:
var Ajv = require('ajv');
var ajv = Ajv();
var schema = {
"type": "object",
"properties": {
"foo": { "type": "number" },
"bar": { "type": "string" }
},
"required": [ "foo", "bar" ]
};
var data = { "foo": 1 };
var valid = ajv.validate(schema, data);
if (!valid) {
return res.send(400, ajv.errorsText(), ajv.errors);
}
答案 2 :(得分:0)
express-validator是一个选项,但我更喜欢直接在我的ODM(Mongoose)中进行大部分验证。例如:
var mongoose = require('mongoose');
var validate = require('mongoose-validator');
var nameValidator = [
validate({
validator: 'isLength',
arguments: [3, 50],
message: 'Name should be between {ARGS[0]} and {ARGS[1]} characters',
type: 'isLength'
}),
validate({
validator: 'isAscii',
passIfEmpty: true,
message: 'Name should contain Ascii characters only',
type: 'isAscii'
})
];
var todoSchema = mongoose.Schema({
name: {
type: String,
required: true,
validate: nameValidator
},
completed: {type: Boolean, required: true}
});
然后你可以这样处理错误对象:
router.post('/newTodo', handlers.newTodo, validationMonad(handlers.getTodos));
如果Mongoose在handlers.newTodo中创建新文档时返回验证错误,则将其传递给验证处理程序,然后验证处理程序将解析它,将解析后的错误附加到响应并调用getTodos处理程序,该处理程序将显示res.errors中的错误。
exports.validationMonad = function (reqHandler) {
return function (err, req, res, next) {
if (!res.errors) res.errors = [];
switch (err.name) {
case 'ValidationError':
for (field in err.errors) {
switch (err.errors[field].kind) {
case 'required':
res.errors.push({
name: err.errors[field].name,
message: "The field '" + err.errors[field].path + "' cannot be empty.",
kind: err.errors[field].kind,
path: err.errors[field].path
});
break;
default:
res.errors.push({
name: err.errors[field].name,
message: err.errors[field].message,
kind: err.errors[field].kind,
path: err.errors[field].path
});
}
}
if (reqHandler) {
reqHandler(req, res, next);
} else {
// JSON
res.json(res.errors[0])
}
break;
case 'CastError':
// Supplied ID is not an ObjectID
res.errors.push({
name: err.name,
message: err.message,
kind: err.kind,
path: err.path
});
if (reqHandler) {
reqHandler(req, res, next);
} else {
// JSON
res.json(res.errors)
}
break;
default:
return next(err)
}
}
};