node.js - 当对 multipart/form-data 使用 request 和 multiparty 时,出现错误 : uncaughtException: source. 不是一个函数

标签 node.js multipartform-data node-request multiparty

我正在尝试将数据从我的 Node 应用程序发送到第 3 方 HTTP 端点。

我正在使用多方模块解析来自客户端的请求对象上的数据,并通过请求模块发送数据。我收到错误

错误:uncaughtException:source.on 不是函数

var request = require('request');
const multiparty = require('multiparty');

function addAttachment(req, res) {
  let form = new multiparty.Form();
  let parsedFile = {};
  const formData = {};
  form.parse(req, function(err, fields, files){
    Object.keys(fields).forEach(function(name) {
      formData[name] = fields[name][0];
    });

    Object.keys(files).forEach(function(name) {
      logger.debug(name);
      parsedFile[name] = files[name][0];
    });
    formData.uploadFile = parsedFile.uploadFile;
    logger.debug('formData ', formData);

    reqOptions.url = imageURL;
    reqOptions.formData = formData;

    logger.debug('REQ_OPTIONS ', reqOptions);

    request.post(reqOptions, function (err, response, body) {
      if (err) {
        logger.warn(req, ' Error sending attachment', err);
        res.status(400);
        res.json({ "msg": "Error sending attachment" });
      } else {
        res.status(201);
        logger.debug('BODY ', body);
        res.send(body);
      }
    });
  });
}

reqOptions obj 包含 headers、url、auth obj,然后我们向其中添加表单数据。

当我记录表单数据时,它看起来格式正确

{
"meta": {
    "prop1": "xxxxxx",
    "prop2": "xxxxxxxxxxxxx",
    "uploadFile": {
        "fieldName": "uploadFile",
        "originalFilename": "test.PNG",
        "path": "/tmp/W1IppPiK04JpkPrnZWEhzkmV.PNG",
        "headers": {
            "content-disposition": "form-data; name=\"uploadFile\"; filename=\"test.PNG\"",
            "content-type": "image/png"
        },
        "size": 42786
    }
}

}

最佳答案

此错误可能是错误消息完全误导的最佳示例之一。所以。对这个问题进行 RCA 非常令人沮丧:

ERROR: uncaught Exception: source.on is not a function

实际上这里没有任何函数的内容。就我而言,我花了几个小时摸不着头脑,最后才发现它是另一个 JSON 下的 JSON,这导致了此错误:

  let subJson = 
  {
      field1: "value1",
      field2: "value2"
  }

  let myJson = 
  {
      field1: "value1",
      field2: "value2",
      field3: subJson
  }

  createFormData(myJson);

就是这个了!当您以 myJson 作为参数调用 createFormData 时,您将看到异常 source.on is not a function!我们一直在想这个功能在哪里?

解决方案是JSON.stringify

   field3: JSON.stringify(subJson)

将解决这个问题。

JavaScript!

关于node.js - 当对 multipart/form-data 使用 request 和 multiparty 时,出现错误 : uncaughtException: source. 不是一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57788965/

相关文章:

javascript - Node : Do I need to end HTTP requests to save memory/CPU?

node.js - 异步调用的 promise 和条件

javascript - Gulp 4 - 拆分主 gulpfile.js

http - 是否有 HTTP 验证器来显示我的供应商的 API 是否创建了格式错误的 POST?

android - 如何使用将文件上传到服务器的方法发送其他字符串参数

python - 在python和nodejs中请求nasdaq.com

Node.js - 通过 HTTPS 发出请求时仅与代理服务器通信

node.js - 我可以在创建模型后将 mongoose 插件添加到模型吗?

php - nodejs - 阻止 php 脚本利用尝试

通过 AWS API Gateway 发布表单数据和二进制数据