我以前从未写过问题,因为我总是在提问之前在这里找到问题的答案。然而,我在 Express 上的文件上传 POST 路由上的 fileFilter 函数上遇到了困难。我在路由中使用了 multer 上传功能,也作为中间件,后面有一个错误处理中间件,但无法让它按照我的预期运行。
我期望“LIMIT_UNEXPECTED_FILE”错误触发一条闪存消息,然后重定向到选择文件上传的同一页面。这种情况有时会发生,但并不一致。如果在我的测试过程中多次上传尝试连续失败,则第三次或第四次请求将挂起。
我知道 fileFilter 函数正在运行,并输出正确的错误,因为我在 post 路由内的上传函数中有多个 console.logs,并且它输出正确的错误。问题是 req.flash 和 res.redirect 没有被触发。
当我在 post 路由中使用上传函数作为中间件,然后在 post 路由之后使用另一个中间件函数来处理错误时,我还遇到了 res.redirect 未触发的问题。不确定我在这里缺少什么?
index.js
// set upload destination and filename for uploads
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, './public/uploads/');
},
filename: (req, file, cb) => {
const {
originalname
} = file;
cb(null, `${uuid()}-${originalname}`);
},
});
// filter by file types uploaded
const fileFilter = (req, file, cb) => {
console.log(file.mimetype);
if (file.mimetype.split('/')[0] === 'image') {
cb(null, true);
} else {
cb(new multer.MulterError('LIMIT_UNEXPECTED_FILE'), false);
}
};
const upload = multer({
storage,
fileFilter,
limits: {
fileSize: 5 * 1024 * 1024
}
}).single('document');
// Upload route - logged in
router.post('/app/admin/upload', function(req, res) {
if (req.isAuthenticated()) {
console.log('testing1');
upload(req, res, (err) => {
if (err) {
console.log(err.code);
if (err.code === 'LIMIT_FILE_SIZE') {
req.flash('docError', 'File upload failed due to file size');
res.redirect('back');
} else if (err.code === 'LIMIT_FILE_COUNT') {
req.flash('docError', 'File upload failed due to file count');
res.redirect('back');
} else if (err.code === 'LIMIT_UNEXPECTED_FILE') {
console.log('testing2');
req.flash('docError', 'File upload failed due to file type');
res.redirect('back');
} else {
console.log(err.code);
req.flash('docError', 'File upload failed due to unknown error');
res.redirect('back');
}
} else {
if (!req.file) {
req.flash('docError', 'No file chosen to upload');
res.redirect('back');
} else {
req.flash('docSuccess', 'File uploaded successfully');
res.redirect('back');
}
}
});
} else {
res.redirect('/');
}
});
触发上传后路由时服务器控制台输出
[nodemon] restarting due to changes...
[nodemon] starting `node ./bin/www`
listening on port 3000
testing12345
application/x-msdownload
LIMIT_UNEXPECTED_FILE
testing 23456