我正在try 将表单数据上传到Express服务器. 在我的Express js服务器上,我有以下内容:

router.post('/uploads/:id', function(req, res) {
  res.send(req.body);
  const title = req.body.title;
  const file = req.file;
});

我发回req.body以查看它是否正确地命中了URL. 当我使用以下内容时:

const response = await fetch('https://example.com/uploads/1234', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify(form) });
const responseData = await response.json();

console.log(responseData);

我将FormData的响应转换为json. 然而,当我这样运行它时:

const file = fs.createReadStream(`${desktopDir}/ai2html-output/home-pro-Artboard_1.jpg`);
const title = 'My file fsf';

const form = new FormData();
form.append('title', title);
form.append('file', file);

    const response = await fetch('https://example.com/uploads/1234', {
      method: 'POST',
      headers: {
        'Content-Type': 'multipart/form-data'
      },
      body: form });
    const responseData = await response.json();

则返回为空对象: {}

我需要在Express服务器上设置什么才能接收表单数据吗?我需要某种类型的中间件吗?

下面是我来自服务器的请求头响应:

:method: POST
:path: /uploads/1234
:scheme: https
accept: */*
accept-encoding: gzip, deflate, br
accept-language: en-US,en;q=0.9
content-length: 17
content-type: multipart/form-data
origin: file://
sec-fetch-dest: empty
sec-fetch-mode: cors
sec-fetch-site: cross-site

推荐答案

我需要在我的Express服务器上设置什么才能接收 表格数据?

Yes, To handle multipart/form-data in your Express server, you must configure a middleware.
For instance multer library.

演示:

Server.js

const express = require("express");
app = express();
const multer = require("multer");
const upload = multer({ dest: "uploads/" });
//----------------------vvvvvvvvvvvvvvvvvvvvvv <------- middleware
app.post("/uploads/:id", upload.single("file"), function (req, res) {
  const title = req.body.title;
  console.log(req.file);
/*
Output of req.file:
{
  fieldname: 'file',
  originalname: 'test.jpg',
  encoding: '7bit',
  mimetype: 'image/jpeg',
  destination: 'uploads/',
  filename: '61d00f21b9813bdcb326082b41b58eb3',
  path: 'uploads\\61d00f21b9813bdcb326082b41b58eb3',
  size: 0
}
*/
  res.json({ msg: `file ${title} uploaded successfully!` });
});
app.listen(1234, () => {
  console.log("app is running on 1234");
});

Upload.js

var fs = require("fs");
const fetch = require("node-fetch");
var FormData = require("form-data");

const form = new FormData();
const title = "Test";
const file = fs.createReadStream(`./test.jpg`);
form.append("title", title);
form.append("file", file);

(async () => {
  try {
    const response = await fetch("http://localhost:1234/uploads/1234", {
      method: "POST",
      //   headers: {
      //     "Content-Type": "multipart/form-data",
      //   },
      body: form,
    });
    const responseData = await response.json();
    console.log(responseData); // you got { msg: 'file Test uploaded successfully!' }
  } catch (error) {
    console.error(error);
  }
})();

Note:获取将自动设置标题,因此只需删除标题"Content-Type": "multipart/form-data".

如果您想要将上传到特定文件夹"Uploads/"的文件保存到标题为req.body.title的文件夹中,请将此配置添加到multer:

const path = require("path");
const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, "uploads/");
  },
  filename: (req, file, cb) => {
    const title = req.body.title;
    cb(null, title + path.extname(file.originalname));
  },
});
const upload = multer({ storage: storage });

Node.js相关问答推荐

编辑Mongoose中的对象嵌套数组

聚合发布/订阅消息

如何在MEVN堆栈中结合创建和更新表单流程?

为什么 mongoose 没有常规数组方法

Node.js 连接在查询完成之前终止

构建期间 Docker 容器中的 npm 安装失败

PEAN auth 应用程序:为什么 Angular 拦截器总是使用BehaviorSubject 返回 null(即初始值),而不是更新后的值?

$not 的聚合版本是什么?

为什么 nginx 不将我的 react index.html 作为后备服务

看起来这段代码try GET 请求发送的值变为空白

无法使用 node 预签名 url 从 React 将图像文件上传到 s3

将环境变量从 GitHub 操作传递到 json

为什么我的react 表单不能正常工作?

后端位于 Docker 容器中时的 SvelteKit SSR fetch()

在Go中,编写非阻塞代码有意义吗?

如何将`yarn.lock`与`package.json`同步?

判断一个数组中的每个元素是否都在第二个数组中

安装 node.JS 时,node.js 运行时和 npm 包管理器选项有什么区别?

npm package.json 操作系统特定脚本

NPM:为什么要安装这个包?