【问题标题】:NodeJS - Parse JSON (only strings or numbers)NodeJS - 解析 JSON(仅字符串或数字)
【发布时间】:2014-05-05 11:18:24
【问题描述】:

我有一点两难选择做什么(我应该做什么)。我的应用程序中有几个地方使用 AJAX 传输 JSON 数据。因此,例如从注册表单中接收数据:

try {
   var data = JSON.parse(json);
}
catch(e) {
   // ...
}

var fields = {
   firstName: data.firstName || "",
   lastName: data.lastName || "",
   ...
};

然后我需要对这些字段做点什么。比方说:

if (fields.firstName) {
   // OK save it to the DB
}

if(fields.lastName.xxx()) { // xxx() is a method that belongs to JS String Object
   // Do something...
}

问题是如果fields.firstNamefields.lastName{} / [] 呢?如果有人发送了带有错误数据类型的修改后的 JSON,则可能会发生这种情况,由于缺少方法 xxx,整个应用程序将崩溃。

我是否必须检查每个字段的类型是否真的是一个字符串、一个数字、一个数组......或者是否有其他更好的方法来做到这一点?

【问题讨论】:

标签: javascript json node.js validation


【解决方案1】:

不幸的是,这是您在使用动态语言(如 JavaScript)时必须随时面临的问题。

一种可能的解决方案是不使用字符串方法,而是创建一个首先检查其参数的函数:

// original, with string methods
if (text instanceof String && text.trim().length === 0) { ... }

// alternative, define function first
var isEmptyString = function(text) {
  if (!(text instanceof String)) throw new Error("Argument must be a String");
  return text.trim().length === 0;
}

// use it in your code
if (isEmptyString(text)) { ... }

这可以带来更简洁的代码。 当您必须在浏览器中使用它们时,请确保不要在全局范围内定义这些函数。在 node.js 模块中应该没有问题。

【讨论】:

    【解决方案2】:

    你必须做一个小验证器。像这样:

    var format = {
      foo: "string",
      bar: "string"
    };
    var data = {
      foo: "bar",
      bar: []
    }
    var validate = function (data, format) {
      for(var d in data) {
        if(typeof data[d] !== format[d]) 
          return false;
      }
      return true;
    }
    console.log(validate(data, format));
    

    您也可以像这样删除无效数据:

    var format = {
      foo: "string",
      bar: "string"
    };
    var data = {
      foo: "bar",
      bar: []
    }
    var validate = function (data, format) {
      for(var d in data) {
        if(typeof data[d] !== format[d]) 
          delete data[d];
      }
      return data;
    }
    console.log(validate(data, format));
    

    【讨论】:

    • 是的,这不是问题,我只是不喜欢整个验证过程。我想我会做一些自定义 JSON.parse 来删除/过滤对象和数组...
    • “我会做一些自定义 JSON.parse”。不不不。已经有数千个模块可供您使用。例如github.com/RushPL/node-screener 会这样做:“删除/过滤对象和数组”。
    【解决方案3】:

    除了 Tharabas 的建议之外,您还可以利用 JSON.parse 的第二个参数进行完整性检查:

    JSON.parse(data, function(key, value) {
      return key === 'firstName' ? cleanup(value) : '';
    });
    

    有关更多信息,请参阅此页面:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse

    【讨论】:

      猜你喜欢
      • 2019-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多