Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 获取错误:uncaughtException:source.on不是函数,当对多部分/表单数据使用request和multiparty时_Node.js_Multipartform Data_Node Request_Multiparty - Fatal编程技术网

Node.js 获取错误:uncaughtException:source.on不是函数,当对多部分/表单数据使用request和multiparty时

Node.js 获取错误:uncaughtException:source.on不是函数,当对多部分/表单数据使用request和multiparty时,node.js,multipartform-data,node-request,multiparty,Node.js,Multipartform Data,Node Request,Multiparty,我正在尝试将数据从节点应用程序发送到第三方HTTP端点 我正在使用多方模块解析来自客户端的请求对象上的数据,并通过请求模块发送数据。我发现了错误 错误:未捕获异常:source.on不是函数 var request = require('request'); const multiparty = require('multiparty'); function addAttachment(req, res) { let form = new multiparty.Form(); let

我正在尝试将数据从节点应用程序发送到第三方HTTP端点

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

错误:未捕获异常: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包含标题、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
    }
}

}

因此,在做了一些梳理和挖掘之后,我能够将表单数据发布到外部API。我决定更改用于连接多方的节点模块。Connect将解析请求头并解码post表单数据,允许您访问
req
obj中的数据,例如
req.body
现在已添加属性,并且
req.files
已上载文件

const multipart = require('connect-multiparty');
const multipartMiddleware = multipart();
然后将
multipartMiddleware
添加到路由

 app.post('/api/addAttachment' multipartMiddleware, MyController.addAttachment);
然后在我的控制器文件中,我将代码更改为使用
connectmultipart

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

function addAttachment(req, res) {
  const TMP = '/tmp';

  let formData = {};

  Object.keys(req.body).forEach((propName) =>{
   if (typeof propName === 'string') {
    logger.debug(propName, ' is a string');
    formData[propName] = req.body[propName];
   } else {
    logger.debug(propName, ' is not a string')
   }
  });
  //The files get added to the tmp folder on the files system,
  //So we create a stream to read from tmp folder, 
  //at the end end we need to delete the file
  formData['uploadFile'] = fs.createReadStream(req.files.uploadFile.path);
  logger.debug('FORM DATA ', formData, '\n');

  reqOptions.url = imageUrl;
  reqOptions.headers = {'Content-Type': 'multipart/form-data','Accept': 'application/json'};
  reqOptions.formData = formData;

  logger.debug('REQ_OPTIONS ', reqOptions, '\n');

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

因此,在做了一些梳理和挖掘之后,我能够将表单数据发布到外部API。我决定更改用于连接多方的节点模块。Connect将解析请求头并解码post表单数据,允许您访问
req
obj中的数据,例如
req.body
现在已添加属性,并且
req.files
已上载文件

const multipart = require('connect-multiparty');
const multipartMiddleware = multipart();
然后将
multipartMiddleware
添加到路由

 app.post('/api/addAttachment' multipartMiddleware, MyController.addAttachment);
然后在我的控制器文件中,我将代码更改为使用
connectmultipart

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

function addAttachment(req, res) {
  const TMP = '/tmp';

  let formData = {};

  Object.keys(req.body).forEach((propName) =>{
   if (typeof propName === 'string') {
    logger.debug(propName, ' is a string');
    formData[propName] = req.body[propName];
   } else {
    logger.debug(propName, ' is not a string')
   }
  });
  //The files get added to the tmp folder on the files system,
  //So we create a stream to read from tmp folder, 
  //at the end end we need to delete the file
  formData['uploadFile'] = fs.createReadStream(req.files.uploadFile.path);
  logger.debug('FORM DATA ', formData, '\n');

  reqOptions.url = imageUrl;
  reqOptions.headers = {'Content-Type': 'multipart/form-data','Accept': 'application/json'};
  reqOptions.formData = formData;

  logger.debug('REQ_OPTIONS ', reqOptions, '\n');

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