Javascript 验证后json数据服务器端

Javascript 验证后json数据服务器端,javascript,node.js,Javascript,Node.js,我使用JavaScriptNodeJS作为服务器端,每次从客户端获取帖子时,我都会验证数据,确保每个键/值的数据结构都存在,所以我会执行以下操作 我想知道有没有更好的办法来做这件事,也许更具可读性, 因为我将每个级别都放在一个if(..)中,并且不能像json/javascript对象那样更改行,所以它很长,很难维护 通常情况下,人们是如何做到这一点的? 构建正确的json对象结构,并与post数据进行比较 如有任何建议,将不胜感激 正确的数据应如下所示: request.data = {

我使用JavaScriptNodeJS作为服务器端,每次从客户端获取帖子时,我都会验证数据,确保每个键/值的数据结构都存在,所以我会执行以下操作

我想知道有没有更好的办法来做这件事,也许更具可读性,
因为我将每个级别都放在一个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' ¦ ¼ ¼
您可以利用该模块观察请求结构中的差异

要从
jsondifffpatch
模块获得
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
}

在我的问题中使用后,我找不到确定结果的方法,键不同或值不同,
所以我找到了另一个可以工作的模块,只需检查$unset或$set即可

var diff = require('rus-diff').diff;

var result = diff(a, b);

if (typeof result.$unset != 'undefined') {
  console.log('different key');
}

使用循环迭代JSON对象。如果您愿意使用库,我发现使用它进行对象验证是一件很愉快的事情。@wolfemm看起来很酷,我现在就试试。谢谢您的回复。我可以在日志中看到,但如何验证比较后的结果??。。。这看起来和问题中的一样,我的问题是找不到确定javascript中存在键不同或值不同的方法。您的注释部分
//在增量中搜索已删除的属性。如果找到,请使请求无效。
这是一个比我提供的解决方案好得多的解决方案。