NodeJS:服务器端请求数据验证

时间:2017-03-17 19:25:59

标签: node.js validation

在服务器端验证传入数据的正确方法是什么? 我正在使用lodash进行简单验证,例如isObjectisArray等,以及validator用于我需要验证的情况,例如字符串isEmail。但这一切看起来都很尴尬,我不确定这会不会影响性能,也不会太多。

应该有一种方法以更优雅的方式验证传入数据。

1 个答案:

答案 0 :(得分:2)

一种方法是使用schema-inspector

它是一个模块,用于根据json模式描述验证json对象。

以下是github README的一个例子:

var inspector = require('schema-inspector');

// Data that we want to sanitize and validate
var data = {
    firstname: 'sterling  ',
    lastname: '  archer',
    jobs: 'Special agent, cocaine Dealer',
    email: 'NEVER!',
};

// Sanitization Schema
var sanitization = {
    type: 'object',
    properties: {
        firstname: { type: 'string', rules: ['trim', 'title'] },
        lastname: { type: 'string', rules: ['trim', 'title'] },
        jobs: {
            type: 'array',
            splitWith: ',',
            items: { type: 'string', rules: ['trim', 'title'] }
        },
        email: { type: 'string', rules: ['trim', 'lower'] }
    }
};
// Let's update the data
inspector.sanitize(sanitization, data);
/*
data is now:
{
    firstname: 'Sterling',
    lastname: 'Archer',
    jobs: ['Special Agent', 'Cocaine Dealer'],
    email: 'never!'
}
*/

// Validation schema
var validation = {
    type: 'object',
    properties: {
        firstname: { type: 'string', minLength: 1 },
        lastname: { type: 'string', minLength: 1 },
        jobs: {
            type: 'array',
            items: { type: 'string', minLength: 1 }
        },
        email: { type: 'string', pattern: 'email' }
    }
};
var result = inspector.validate(validation, data);
if (!result.valid)
    console.log(result.format());
/*
    Property @.email: must match [email], but is equal to "never!"
*/

sanitization架构旨在"清理"你的json在验证之前(设置可选值,尝试将数字转换为字符串等)。

validation架构描述了json应该尊重的属性。

然后调用inspector.validate检查一切是否正常。