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

7

我将尝试使用Node.js的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();

但我遇到了错误。
First argument must be a string or Buffer

我试图使用formData.toString()发送我的文件,但是使用此方法后,错误消失了,但我的文件不能正常工作。我已经像下面这样发送数据:

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

我该如何使用这个请求将我的文件发送到其他服务器?

谢谢


您没有设置请求头。 - Sameer
尝试使用这个头部信息:{ 'Content-Type': 'multipart/formdata' },但是没有起作用。我需要使用toString()方法发送它吗? - Unknown
你能添加你正在使用的模块来提供FormData吗? - robertklep
3个回答

6

我假定您正在使用form-data

为了修复First argument must be a string or Buffer错误,请将以下内容替换:

req.write(formData);
req.end();

使用

formData.pipe(req);

(formData 的行为类似于 Node.js 的 ReadableStream)

您还应该向请求添加头信息:

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

来源:https://github.com/form-data/form-data#替代提交方法


1
formData.pipe(req); 挽救了我的一天。 :) - Jignesh M. Khatri
Node 18+版本提供了一个原生的FormData对象,该对象不包含.pipe().getHeaders()方法。 - Boris Verkhovskiy
Node 18+版本自带了一个原生的FormData对象,该对象没有.pipe()或者.getHeaders()方法。 - user3064538

2

我曾经遇到过类似的问题。我使用NPM上可用的form-data包和axios包来解决这个问题,您可以在这里找到form-data,在这里找到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() }
});

OP正在使用https.request,而不是axios。 - undefined

0
你可以使用Node内置的body-parser模块将表单数据解析为JSON格式,需要使用以下代码: app.use(bodyParser.json()); // 用于解析application/json app.use(bodyParser.urlencoded({ extended: true })); 当你使用req.body时,它会将你的表单数据转换成对象形式。

请您能否提供一些代码示例? - MadaShindeInai

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