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

时间:2018-12-03 06:13:06

标签: javascript node.js https

我正在尝试将我的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();

但是我得到了错误

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)
    };

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

谢谢

3 个答案:

答案 0 :(得分:1)

我假设您正在使用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#alternative-submission-methods

答案 1 :(得分:0)

我曾经遇到过类似的问题。我使用NPM here上的form-data软件包here

来解决它

下面的代码段对我有用

axios

答案 2 :(得分:0)

您可以使用节点内置的body-parser模块将表单数据解析为JSON和 你必须使用 app.use(bodyParser.json()); // for parsing application/json app.use(bodyParser.urlencoded({ extended: true })); 而当您执行req.body时,它将把表单数据转换为对象表单。