【问题标题】:Access file upload formData in ExpressExpress中访问文件上传formData
【发布时间】:2021-04-15 17:24:18
【问题描述】:

如何访问 API 中的文件?

我阅读了其他解决方案,它们都需要 npm 包来解决这个问题。我想明白为什么我不能做香草。此外,答案很旧,建议使用现在与 Express 捆绑在一起的 body-parser。

我希望解决方案是 vanilla JS,以便更好地理解流程。

客户

async function uploadFile(file) {
    let formData = new FormData();
    formData.append("file", file);

    let res = await fetchPostFile("/api/files", formData);
}

获取

export async function fetchPostFile(url, formData) {
    try {
        let result = await (
            await fetch(url, {
                method: "POST",
                withCredentials: true,
                credentials: "include",
                headers: {
                    Authorization: localStorage.getItem("token"),
                    Accept: "application/json",
                    "Content-type": "multipart/form-data",
                },
                body: formData,
            })
        ).json();

        return result;
    } catch (err) {
        return err;
    }
}

api

router.post("/api/files", async function (req, res, next) {
    try {
        console.log(req.file);          // undefined
        console.log(req.files);         // undefined
        console.log(req.body);          // {}

    } catch (err) {
        next(err);
    } finally {
        req.connection.release();
    }
});

为什么req.body 是空的?请帮助我理解我做错了什么。

【问题讨论】:

  • 这能回答你的问题吗? Express js form data
  • 不,因为在 Express 中内置了正文解析器,而在我的情况下,req.body 是空的。我在研究完所有内容后问了这个问题。
  • body-parser 不是内置的。但是,由于您使用的是multipart/form-data,因此您需要改用multer。这两点都在我链接的答案中提出。

标签: node.js express upload fetch


【解决方案1】:

首先您需要使用multer 包来处理multipart/form-data 快递。您必须将其用作中间件来设置文件的字段名称。作为参数传递给single() 函数的名称必须与客户端附加的名称匹配。

const multer = require('multer')

router.post("/api/files", multer().single('file'), async function (req, res, next) {
  try {
      console.log(req.file)
  } catch (err) {
      next(err)
  } finally {
      req.connection.release()
  }
});

【讨论】:

  • 为什么我需要一个包?我特别要求一种普通的方式来做到这一点。
  • 我明白了,但为什么需要 Multer?
  • 您尝试发送表单数据,但您没有告诉快递它应该接收表单数据。 Multer 能够处理客户端发送的表单数据。
  • 所以你说你必须使用一个库,即 Express 不支持它。
  • 如果有工具可以让你的工作更轻松,你为什么要使用 vanilla js?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-02
  • 2023-04-06
  • 1970-01-01
  • 2020-10-12
  • 2017-05-14
  • 2017-08-30
  • 2017-09-06
相关资源
最近更新 更多