在服务器端验证传入数据的正确方法是什么?
我正在使用lodash进行简单验证,例如isObject
或isArray
等,以及validator用于我需要验证的情况,例如字符串isEmail
。但这一切看起来都很尴尬,我不确定这会不会影响性能,也不会太多。
应该有一种方法以更优雅的方式验证传入数据。
答案 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
检查一切是否正常。