如何使用 node.js 中的请求以多部分形式数据发送对象
How to send an object in multipart formData using request in node.js
我正在尝试使用 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
对象,一切正常。
这是为什么 - 我做错了什么?
我在使用请求模块时遇到了类似的问题,在我向 'formData' 添加新行之前一切正常。唯一对我有用的是创建一个字符串 JSON ,它将构成请求之外的 POST 主体,并使用 'body' 而不是 'formData'.
var postBody = "post body content";
request({
method: "POST",
uri: "my_service",
auth: { user: 'username', password: 'password' },
body: '{' + postBody + '}',
...
}).on("error", function(error){
...
};
formData
属性不处理作为值传入的 对象 。参见 the documentation。一种解决方案是使用 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包。请求使用表单数据。这是他们的 usage doc,其中提到使用 "a string, a buffer and a file stream."
我正在尝试使用 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
对象,一切正常。
这是为什么 - 我做错了什么?
我在使用请求模块时遇到了类似的问题,在我向 'formData' 添加新行之前一切正常。唯一对我有用的是创建一个字符串 JSON ,它将构成请求之外的 POST 主体,并使用 'body' 而不是 'formData'.
var postBody = "post body content";
request({
method: "POST",
uri: "my_service",
auth: { user: 'username', password: 'password' },
body: '{' + postBody + '}',
...
}).on("error", function(error){
...
};
formData
属性不处理作为值传入的 对象 。参见 the documentation。一种解决方案是使用 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包。请求使用表单数据。这是他们的 usage doc,其中提到使用 "a string, a buffer and a file stream."