意外的输入结束 - 在Express / Node App上卷曲JSON

时间:2016-02-18 22:19:36

标签: javascript json curl heroku

我有一个部署到Heroku实例的Express / Node应用程序。该应用程序具有POST api端点,该端点需要.json文件,读取数据并使用JSON数据填充应用程序。下面是处理POST请求的后端代码:

router.route('/data')
  .post(function (req, res) {
    return DataUtils.storeData(req, res);
  });

Utils.storeData = function (req, res) {
  req.pipe(req.busboy);
  req.busboy.on('file', function (fieldname, file, filename) {
    file.on('data', function(data) {
      var data;
      try {
        data = JSON.parse('' + data);  // quick casting into a String
        var numPersonSessionObj = data.length;
        ...
        // etc etc...

当我们尝试通过下面的curl命令发出请求时:

  

卷曲-H"内容长度:5567" -F file=@sample_data/sample_json.json   http://[heroku-instance]/api/data

服务器有时可以正常工作,上传数据,有时会抛出"意外的输入结束"错误。似乎我们使用的缓冲方法由于某种原因没有读取所有数据。在上面的代码中记录data.length(即JSON)时,似乎每当数据长度小于它应该的时候请求就会失败。我在上面的JSON文件中阅读的方式有问题吗?谢谢 -

2 个答案:

答案 0 :(得分:4)

data事件仅表示已收到部分数据 - 并未收到所有数据。您希望在解析JSON之前等待end事件。有关详细信息,请参阅官方文档中的此示例:https://nodejs.org/api/stream.html#stream_api_for_stream_consumers

答案 1 :(得分:1)

Content-Length必须是响应主体的八位字节数。

如果您尝试使用

的值
data.length

而不是

Buffer.byteLength(data)