node.js - Multer 未填充请求正文
问题描述
我的 Web 应用程序以包含 2 个文本字段和一个文件的多部分表单的形式发出发布请求。
我可以通过 req.file 完美地访问文件数据,但是请求正文始终未定义。
我发现一些帖子建议重新排列字段,以便文件是表单中的最后一条数据......这也没有解决问题!
从前端发出 post 请求
uploadData(fileToUpload, xx, yy) {
const URL = 'http://localhost:5000/api/files/';
this.setState({ uploadingFile: true });
let formData = new FormData();
formData.append('testx', xx);
formData.append('testy', yy);
formData.append('file', fileToUpload);
fetch(URL, {
method: 'POST',
body: formData,
})
后端处理请求
const multer = require('multer');
const upload = multer({
dest: 'labels/',
fileFilter: function (req, file, cb) {
if (file.mimetype !== 'application/pdf') {
return cb(null, false, new Error('Incorrect file type'));
}
cb(null, true);
},
limits: { fileSize: 100000 },
}).single('file');
...
...
...
router.post('/', checkRequestType, upload, (req, res) => {
upload(req, res, function (err) {
if (err instanceof multer.MulterError) {
console.log('We got a multer error boys');
console.log(err);
return res.send('Error with multer');
} else if (err) {
console.log('Error - not caused by multer... but during upload');
return res.send('Unknown error during upload');
}
//Always null here?!?!
console.log(req.body);
});
});
解决方案
这里有几个问题。主要的是你打upload
了两次电话。第一个作为中间件,然后您第二次手动调用它(以便您可以处理错误)。
你需要改变
router.post('/', checkRequestType, upload, (req, res) => {
对此
router.post('/', checkRequestType, (req, res) => {
这应该可以解决空体问题。
第二个问题是您在这一行中向 cb 传递了太多参数return cb(null, false, new Error('Incorrect file type'))
。第一个参数应该是错误:return cb(new Error('Incorrect file type'))
推荐阅读
- dialogflow-es - 如何让别人的安卓手机使用你未发布的 Google Action 的测试版?
- android - Kotlin mutableMap在android中自动更改?
- javascript - 在 Jekyll 中压缩/缩小 JavaScript 文件
- java - 将来自 JInterface Java 应用程序的二进制响应转换回 Elixir 中的字符串列表
- javascript - 使用 fetch() 函数返回未定义
- c++ - 无法将智能 ptr 移动到 std::function
- postgresql - 使用列表替换 regexp_replace 中的奇异模式
- javascript - 在 CORS 请求后未存储 ASPXAUTH cookie
- python - 在不使用 PIP 的情况下分发 Python 应用程序
- python-3.x - 使用 Pandas 编写第二个标题和合并单元格