意外的输入结束 - 快速/节点应用程序上的 curl JSON

Unexpected End of Input - curl JSON on Express/Node App

本文关键字:应用程序 应用 程序上 curl JSON 节点 输入 结束 快速 意外      更新时间:2023-09-26

我有一个部署到 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 命令发出请求时:

curl -H "Content-Length: 5567" -F file=@sample_data/sample_json.json http://[heroku-instance]/api/data

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

data 事件仅指示已收到某些数据,而不是已收到所有数据。您希望在解析 JSON 之前等待end事件。有关更多详细信息,请参阅官方文档中的此示例:https://nodejs.org/api/stream.html#stream_api_for_stream_consumers

Content-Length 必须是响应正文的八位字节计数。

如果您尝试使用

data.length

而不是

Buffer.byteLength(data)