3

在 Node.js 中,有没有比将分块输入附加到字符串并JSON.parse()随后在其上运行更好的方法来接受 JSON 数据?服务器不能假设 JSON 输入是有效的,并且JSON.parse()是我知道的验证 JSON 数据的唯一方法。

假设以下服务器接受:

  • 仅 POST 请求
  • 仅 JSON 数据
  • 只有一个Content-Type标题"application/json"

.

var server = http.createServer(function(req, res) {
    ....

    var parsedData;
    var inputData = '';

    req.on('data', function(chunk) {
        inputData += chunk;
    });

    req.on('end', function() {
        parsedData = JSON.parse(inputData);
    }

    ....
}

如果我如此严格地执行输入数据,那么简单地将这些数据附加到一个字符串然后JSON.parse()它,本质上(假设输入了正确的 JSON)似乎很奇怪JSON -> string -> JSON。(当然,不能假设数据是有效的。)

4

1 回答 1

2

你在做什么真的很好。但是,性能调整可能是将每个块添加到数组中,然后加入数组,而不是每次都创建一个新字符串。

例如

var inputData = [];
var parsedData;

req.on('data', function(chunk{
    inputData.push(chunk); //assuming chunk is from utf-8 stream, if not call chunk.toString()
});

req.on('end', function(){
    try {
       parsedData = JSON.parse(inputData.join(''));
    } catch (err) {
      //handle error    
    }
});

这样您就不会每次都重新分配和创建一个新字符串inputData += chunk。请注意,这对于预期的小输入来说很好,因为 V8 很好地优化了这种情况。

现在,关于糟糕的 JSON。您确实有可能想要查看的选项。

  1. JSONStream - 我不太确定它如何处理解析错误,但对于大型 JSON 输入来说非常好。

  2. json-scrape - 这在过滤掉不是 JSON 的错误输入方面做得非常好。

希望这些信息对一些人有所帮助。

于 2012-10-15T05:05:32.440 回答