如何在Node.js中使用请求发送多部分formData中的对象

7
我正在尝试使用request来构建一个 POST 请求,但每次我尝试添加to对象到formData中时都会出现错误。请帮我检查一下。
var fs      = require('fs');
var request = require('request');
var file    = './test/assets/test.pdf';

var opts = {
  url: 'my_service',
  method: 'POST',
  auth: { user: 'username', password: 'password' },
  json: true,
  formData: {
    front: fs.createReadStream(file),
    to: {
      name: 'joe bob',
      address_1: '123 main st',
      ...
    }
  }
};

request(opts, function(err, resp, body) {
  console.log(err, body);
});

这是错误信息:

/sandbox/project/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js:33
  source.on('error', function() {});
         ^
TypeError: undefined is not a function
    at Function.DelayedStream.create (/Users/me/sandbox/project/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js:33:10)
    at FormData.CombinedStream.append (/Users/me/sandbox/project/node_modules/request/node_modules/combined-stream/lib/combined_stream.js:43:37)
    at FormData.append (/Users/me/sandbox/lproject/node_modules/request/node_modules/form-data/lib/form_data.js:43:3)
    at appendFormValue (/Users/me/sandbox/project/node_modules/request/request.js:466:21)
    at Request.init (/Users/me/sandbox/project/node_modules/request/request.js:477:11)
    at new Request (/Users/me/sandbox/project/node_modules/request/request.js:264:8)
    at request (/Users/me/sandbox/project/node_modules/request/index.js:50:10)
    at Object.<anonymous> (/Users/me/sandbox/project/test.js:30:1)
    at Module._compile (module.js:460:26)
    at Object.Module._extensions..js (module.js:478:10)

如果我删除to对象,一切正常。为什么会这样呢?我做错了什么吗?
2个回答

13

formData 属性无法处理以对象形式传递的值。请参阅文档。解决方法是使用 JSON.stringify

var fs      = require('fs');
var request = require('request');
var file    = './test/assets/test.pdf';

var toObj = {
  name: 'joe bob',
  address_1: '123 main st',
  ...
};
var opts = {
  url: 'my_service',
  method: 'POST',
  auth: { user: 'username', password: 'password' },
  json: true,
  formData: {
    front: fs.createReadStream(file),
    to: JSON.stringify(toObj)
  }
};

request(opts, function(err, resp, body) {
  console.log(err, body);
});

注意:实际上只有form-data包支持字符串。Request使用form-data。这是他们的使用文档,提到可以使用“字符串、缓冲区和文件流”。


0
我在使用request模块时遇到类似的问题,一切正常,直到我在'formData'中添加了一个新行。对我有效的唯一方法是创建一个字符串,该字符串将成为POST主体的JSON,并在请求外部传递它作为'body'而不是'formData'。
var postBody = "post body content";

request({
  method: "POST",
  uri: "my_service",
  auth: { user: 'username', password: 'password' },
  body: '{' + postBody + '}',
  ...
}).on("error", function(error){
  ...
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接