验证请求参数的最佳方法sails.js / node.js

时间:2016-03-16 11:11:47

标签: javascript node.js rest validation sails.js

目前我正在使用Sails.JS实现一个应用程序。每次REST请求命中我的风帆控制器时,我都会手动(如果检查)检查验证,如果变量是否存在/是否存在有效数据类型。

是否有任何标准方法(自定义中间件可以根据预定义的JSON对象验证每个请求?)以验证参数是否超出我的控制器逻辑标题。

如何在生产使用的其他编程语言/框架中处理它?<​​/ p>

提前致谢。 Prasad.CH

3 个答案:

答案 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)
        }
    }
};