我已将 multer 配置为使用表单数据中的自定义字段来保存上传的文件名。 但是,如果请求中不存在该数据,我的应用程序将引发错误并崩溃。 参考 multer 文档,他们声称“遇到错误时,Multer 会将错误委托给 Express。您可以使用标准 Express 方式显示漂亮的错误页面。” 这是正常的吗?我应该自己使用中间件功能(为了能够捕获错误)? 或者我错过了什么?
const multerStorage = multer.diskStorage({
destination: (req, file, cb) => {
let path = `uploads/${req.body.name}`;
fs.mkdirsSync(path);
cb(null, path);
},
filename: (req, file, cb) => {
const ext = file.mimetype.split('/')[1];
cb(null, `${req.body.customField.toUpperCase()}.${ext}`);
},
});
const upload = multer({
storage: multerStorage,
});
app.post('/', upload.single('photo'), (req, res, next) => {
console.log(req.file);
console.log(req.body);
res.status(201).json({
status: 'Sucess',
});
});
我尝试定义一个全局错误处理中间件,但 multer 配置中发生的错误不会传递给它。
根据您提供的代码,您似乎已正确配置 multer 以使用表单数据中的自定义字段来保存上传的文件名。但是,如果请求中不存在该自定义字段,multer 会将错误委托给 Express,您可以使用标准 Express 错误处理机制来处理它。
在代码中,您可以通过在 multer 中间件之后添加错误处理中间件函数来捕获错误。如果文件上传过程中发生错误,将会调用该中间件函数。以下是如何处理错误的示例:
app.post('/', upload.single('photo'), (req, res, next) => {
// Handle successful file upload
console.log(req.file);
console.log(req.body);
res.status(201).json({
status: 'Success',
});
});
// Error handling middleware
app.use((err, req, res, next) => {
// Handle multer errors
if (err instanceof multer.MulterError) {
// Display a nice error page or send an error response
res.status(400).json({
error: 'File upload error',
});
} else {
// Pass the error to the next error handling middleware
next(err);
}
});
通过添加此错误处理中间件,您可以捕获任何 multer 错误并进行适当的处理。