如何在没有浏览器的情况下在 node.js 中使用 FormData?

Ade*_*nut 23 javascript forms multipartform-data form-data node.js

我想在没有浏览器的 nodejs 中发出 post 请求,因为它是后端代码。

const formdata = new FormData()
formdata.append('chartfile', file);
Run Code Online (Sandbox Code Playgroud)

但是上面的代码给了我错误为FormData not defined. 我正在使用 ES6。

任何人,谁能让我知道如何在 nodejs 中使用 FormData?

sud*_*oul 63

如果您只需要提交string值而不是BufferReadStream,那么URLSearchParams可以为您工作!

原始示例

var fs = require('fs');
 
var form = new URLSearchParams();
form.append('my_field', 'my value');
form.append('my_second_field', 'my value 2');
form.append('my_third_field', 'my value 3');
Run Code Online (Sandbox Code Playgroud)

轴示例

const formData = new URLSearchParams();
formData.append('field1', 'value1');
formData.append('field2', 'value2');
const response = await axios.request({
  url: 'https://example.com',
  method: 'POST',
  headers: {'Content-Type': 'application/x-www-form-urlencoded'},
  data: formData
});
Run Code Online (Sandbox Code Playgroud)

  • 这并不像描述的那样工作。URLSearchParams 仅接受字符串作为值,因此 ReadStream 或 Buffer 无效。因此,这并不等同于 FormData。 (6认同)
  • 如果请求是“multipart/form-data”,这将不起作用。 (6认同)
  • @OMKARAGRAWAL 你应该刚刚编辑这个或在这里贡献它,在不需要时分叉只会增加噪音。重点是什么 (2认同)
  • 那是完全错误的!URLSearchParams 和 FormData 是两个不同的东西,它不起作用。 (2认同)

Rad*_*ard 30

您应该使用form-data - npm 模块。因为formData()不是 NodeJS API

用这种方式,

var FormData = require('form-data');
var fs = require('fs');
 
var form = new FormData();
form.append('my_field', 'my value');
form.append('my_buffer', new Buffer(10));
form.append('my_file', fs.createReadStream('/foo/bar.jpg'));
Run Code Online (Sandbox Code Playgroud)

  • `FormData` 是一个 Node API [从 Node 18 开始](https://developer.mozilla.org/en-US/docs/Web/API/FormData#browser_compatibility) (5认同)
  • 感谢您的回答。我正在使用 ES6,所以我像这样导入:`import FormData from 'form-data'` 但我收到错误 `form_data_1.default is not a constructor` (2认同)

Bra*_*zic 29

FormData现在是 Node 18 的一部分。他们删除了在 Node 17 中引入的实验性警告:https://github.com/nodejs/node/commit/d33cbabd79

现在您可以在没有任何依赖的情况下使用它fetch


ome*_*ell 8

在我看来,不需要额外依赖项的最干净的解决方案是:

const formData = new URLSearchParams({
  param1: 'this',
  param2: 'is',
  param3: 'neat',
}) 
Run Code Online (Sandbox Code Playgroud)


fam*_*zah 6

我建议使用 npm 模块formdata-node,因为它是 Node.js 的完整(符合规范)FormData实现。它支持 ESM/CJS 目标,因此支持 EM6。您可以在npm 模块页面找到一些示例。


Dan*_*iel 5

FormData是 JS web API 的一部分(不包含在原生 NodeJS 中)。您可以安装该form-data软件包。

  • `从“表单数据”导入 * 作为 FormData;` (3认同)
  • @AdelinIonut @DenesTarjan 对我来说它的工作更简单`从“表单数据”导入 FormData;` (3认同)
  • 对我来说,这就是有效的:`import {default as FormData } from "form-data";` (2认同)