在nodejs中使用https.request发送表单数据

Unk*_*own 7 javascript https node.js

我正在尝试使用我的nodejs服务器将请求发布到另一台服务器,然后我必须将响应保存在文件中。我正在使用nodejs https.request 模块。

这是我的要求:

    var formData = new FormData();
    formData.append('first',3);
    formData.append('second', '25');
    formData.append('source_file', fs.createReadStream(sourcefile));
    formData.append('source_image', fs.createReadStream(sourceimage));

var options = {
    hostname: 'ip',
    path: '/api/path',
    method: 'POST'
}
var file = fs.createWriteStream("file.pdf");
var req = https.request(options, (response) => {
    response.pipe(file);
    console.log("File saved");
    response.send("done")
  });

  req.on('error', (e) => {
    console.error(e);
  });

  req.write(formData);
  req.end();
Run Code Online (Sandbox Code Playgroud)

但我收到错误

First argument must be a string or Buffer
Run Code Online (Sandbox Code Playgroud)

我尝试使用发送我的文件formData.toString(),但是使用它时,错误消失了,但我的文件无法正常工作,而且我也发送了如下数据:

 var formData = new FormData();
formData = {
        first: 3,
        second: '25',
        source_file: fs.createReadStream(sourcefile),
        source_image: fs.createReadStream(sourceimage)
    };
Run Code Online (Sandbox Code Playgroud)

如何使用此请求将我的文件发送到其他服务器。

谢谢

小智 6

我假设您正在使用form-data。要修复First argument must be a string or Buffer错误,请替换:

req.write(formData);
req.end();
Run Code Online (Sandbox Code Playgroud)

formData.pipe(req);
Run Code Online (Sandbox Code Playgroud)

formData行为类似于 Node.js ReadableStream

您还应该向您的请求添加标头:

var options = {
    hostname: 'ip',
    path: '/api/path',
    method: 'POST',
    headers: formData.getHeaders()
}
Run Code Online (Sandbox Code Playgroud)

来源: https: //github.com/form-data/form-data#alternative-submission-methods


par*_*ola 2

我曾经遇到过类似的问题。我使用form-dataNPM 上提供的包和此处axios包解决了这个问题

下面的代码片段对我有用

const FormData = require("form-data");
const axios = require("axios");

const form = new FormData();
form.append("first", 3);
// other data should go here
form.append("file", fs.createReadStream("filePath"));

axios({
  method: "post",
  url: "url",
  data: form,
  headers: { ...form.getHeaders() }
});
Run Code Online (Sandbox Code Playgroud)