validation后json数据服务器端
我使用javascript的nodejs作为服务器端,每次从客户端发帖,我会validation数据,确保每个键/值的数据结构存在,所以我做了下面的东西。
我不知道有没有更好的想法做到这一点,也许有很多可读性,
因为我把每个级别放在一个如果(..),不能像json / javascript对象那样更换行,所以它很长很难维护。
通常人们如何做到这一点?
build立一个正确的JSON对象结构,并与后期数据进行比较?
任何build议将不胜感激
正确的数据应该是这样的:
request.data = { "user": { "status": "int", "role": { "role": "int" }, "information": { "email": "text", "password": "text", "username": "text", "country": "text", ... a lot .... } }, }
服务器端validation
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结构,并与后期比较,我发现一些json diff 模块,但找不到如何更正用法只比较键
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后在我的问题,结果不同或价值不同,
所以我find另一个模块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;
要validation请求,您可以将请求与模板进行比较。 例如,模板定义如下:
var requestTemplate = { "user": { "status": "int", "role": { "role": "int" }, "information": { "email": "text", "password": "text", "username": "text", "country": "text", ... a lot .... } }, }
要将请求与模板进行比较,请find两者之间的区别:
var delta = diff(request.data, requestTemplate);
search具有此签名值的任何属性的增量:
'email': ['text', 0, 0]
此签名表示该物业已被删除。 例如,上面的值表示request.data
对象没有email
属性。 没有这个属性意味着请求是无效的。
你可以定义一个函数来执行validation,如下所示:
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 }