我使用javascript nodejs作为服务器端,每次从客户端获取帖子时,我都会验证数据,确保每个键/值的数据结构都存在,所以我做了下面这样的事情。
我想知道有没有更好的主意来做到这一点,也许更具可读性,
因为我把每个级别都放在一个if(..)中,并且不能像json/javascript对象那样更改行,所以它很长而且很难维护。
通常人们如何做到这一点?
构建正确的 JSON 对象结构,并与 POST 数据进行比较?
任何建议将不胜感激
正确的数据应该是这样的:
request.data = {
"user": {
"status": "int",
"role": {
"role": "int"
},
"information": {
"email": "text",
"password": "text",
"username": "text",
"country": "text",
... a lot ....
}
},
}
服务器端验证
var validateRequest = 'true';
if (typeof request.data.user == 'undefined') {
validateRequest = 'false';
} else {
if (typeof request.data.user.status == 'undefined' || typeof request.data.user.role == 'undefined' || typeof request.data.user.information == 'undefined') {
validateRequest = 'false';
} else {
if (typeof request.data.user.role == 'undefined' || typeof request.data.user.information.email == 'undefined' ... ) {
validateRequest = 'false';
}
}
}
if (validateRequest != 'false') {
// validate data type
// use data crud
}
更新
我尝试在服务器端设置正确的json结构,并与post进行比较,我找到了一些json差异模块,但找不到如何纠正用法仅比较键
var a = {
"information": {
"email": "text",
"password": "text"
}
}
var b = {
"information": {
// "email": "text",
"password": "text"
}
}
console.log(jsondiffpatch.diff(a, b));
I only know if data not different will get undefined
if b remove "email"
get this in console ?? ¨ information: ¨ email: ÿ 'text', 0, 0 ¦ ¼ ¼
if b email val = textt
get this information: ¨ email: ÿ 'text', 'textt' ¦ ¼ ¼
我找不到在我的问题中使用jsondiffpatch后确定结果的方法,键不同或值不同,
所以我找到了另一个模块 https://github.com/mirek/node-rus-diff 它的工作原理,只需检查$unset或$set
var diff = require('rus-diff').diff;
var result = diff(a, b);
if (typeof result.$unset != 'undefined') {
console.log('different key');
}
您可以利用 jsondiffpatch 模块来观察请求结构的差异。
要从jsondiffpatch
模块获取diff
函数,请执行以下操作:
var diff = require('jsondiffpatch').diff;
若要验证请求,可以将请求与模板进行比较。例如,模板定义如下:
var requestTemplate = {
"user": {
"status": "int",
"role": {
"role": "int"
},
"information": {
"email": "text",
"password": "text",
"username": "text",
"country": "text",
... a lot ....
}
},
}
要将请求与模板进行比较,请找出两者之间的区别:
var delta = diff(request.data, requestTemplate);
在增量中搜索具有此签名值的任何属性:
'email': ['text', 0, 0]
此签名指示该属性已删除。例如,上面的值指示 request.data
对象没有 email
属性。缺少此属性意味着请求无效。
您可以定义一个函数来执行验证,如下所示:
function validateRequest(template, requestData) {
var delta = diff(requestData, template);
// Search the delta for a deleted property. If found, invalidate the request.
// If there is any key whose value looks like this:
// 'email': ['text', 0, 0]
// it means that the key has been removed and the request is invalid
}