【问题标题】:Sending form data in nodejs using https.request使用 https.request 在 nodejs 中发送表单数据
【发布时间】:2019-05-04 10:19:52
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 您没有设置请求标头。
  • 试过这个标题:{ 'Content-Type': 'multipart/formdata' } 不起作用。我必须用 toString() 发送它吗?
  • 你能添加你使用哪个模块来提供FormData吗?

标签: javascript node.js https


【解决方案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

【讨论】:

  • formData.pipe(req); 拯救了我的一天。 :)
【解决方案2】:

我曾经遇到过类似的问题。我使用 NPM here 上的 form-data 包和 axioshere 解决了它

下面的 sn-p 对我有用

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2016-08-05
      • 2019-01-22
      • 1970-01-01
      • 2013-01-24
      • 2020-01-29
      • 1970-01-01
      • 1970-01-01
      • 2019-09-01
      • 1970-01-01
      相关资源
      最近更新 更多