【发布时间】:2020-10-06 05:38:21
【问题描述】:
我正在使用 Vercel 无服务器函数来处理上传到 Digital Ocean Spaces 的文件(与 AWS S3 相同的 API)。但是,我遇到了在请求处理程序中处理 multipart/form-data 的问题。
在前端,我使用 fetch 发布带有文件和几个文本字段的 FormData() 对象。在标题上记录正文和服务器时,我可以按预期看到那里的所有内容,但是在使用 Multer 处理多部分时(我还尝试了其他几个类似的包)我无法检索任何已发布的字段或文件.
另外值得注意的是,在使用 Postman 测试 POST 请求时,我遇到了完全相同的问题,因此我确信问题在于无服务器功能。
前端:
const handleSubmit = async (values) => {
const formData = new FormData();
// build my Form Data from state.
Object.keys(values).forEach(key => {
formData.append(key, values[key]);
});
const response = await fetch("/api/post-submission", {
method: "POST",
headers: {
Accept: "application/json",
},
body: formData,
});
const json = await response.json();
};
无服务器处理程序:
const util = require("util");
const multer = require("multer");
module.exports = async (req, res) => {
await util.promisify(multer().any())(req, res);
console.log("req.body", req.body); // >> req.body [Object: null prototype] {}
console.log("req.files", req.files); // >> req.files []
// Do the file upload to S3...
res.status(200).json({ uploadData });
};
预期行为:
req.body 和 req.files 应该填充我提交的数据。
【问题讨论】:
-
您可以尝试生成一个预签名 URL 并将其提供给客户端以将文件直接上传到 S3,从而跳过无服务器功能
-
@Jack-wild 你解决了吗?
-
@T.Vojtech 恐怕不行——Vercel 帮助团队要求我提供一份复制品,但我还没有收到他们的回复。在 Vercel 上使用 next.js 似乎确实是一个错误(如果您直接在 Vercel 上运行无服务器函数,它们可以正常工作,但是当您还使用 Next.js 时,即使代码相同,它们也不会)
标签: node.js forms multipartform-data serverless vercel