Multer 不填充请求正文
Multer not populating request body
我的网络应用程序正在以包含 2 个文本字段和一个文件的多部分表单的形式发出 post 请求。
我可以通过 req.file 完美访问文件数据,但是请求正文始终未定义。
我发现一些 post 建议重新排列字段,以便文件是表单中的最后一条数据......这也没有解决问题!
从前端发出 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) => {
这应该可以解决空体问题。
第二个问题是您在这一行 return cb(null, false, new Error('Incorrect file type'))
中向 cb 传递了太多参数。第一个参数应该是错误:return cb(new Error('Incorrect file type'))
我的网络应用程序正在以包含 2 个文本字段和一个文件的多部分表单的形式发出 post 请求。
我可以通过 req.file 完美访问文件数据,但是请求正文始终未定义。
我发现一些 post 建议重新排列字段,以便文件是表单中的最后一条数据......这也没有解决问题!
从前端发出 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) => {
这应该可以解决空体问题。
第二个问题是您在这一行 return cb(null, false, new Error('Incorrect file type'))
中向 cb 传递了太多参数。第一个参数应该是错误:return cb(new Error('Incorrect file type'))