如果上传文件后需要使用中间件,如何使用 Multer 处理异常

How can I handle exceptions using Multer if I need to use middlewares after uploading a file

Multer是Express JS推荐的上传文件的中间件包。检查他们使用的错误处理部分 this example:

const multer = require('multer')
const upload = multer().single('avatar')

app.post('/profile', function (req, res) {
  upload(req, res, function (err) {
    if (err instanceof multer.MulterError) {
      // A Multer error occurred when uploading.
    } else if (err) {
      // An unknown error occurred when uploading.
    }

    // Everything went fine.
  })
})

如您所见,该错误处理示例是在路由的常规代码中执行的。 这对我来说是个问题,因为我需要在执行两个像这样的中间件函数之前处理这些错误

app.post('/profile', [middlewareFunctions.Authenticate,middlewareFunctions.getDataUploadedFile], function (req, res) {

})

所以基本上我的问题是,在执行中间件之前,我可以在哪里使用 Multer 的错误处理部分?。谢谢

PS: Someone already posted this question on Whosebug 但没有正确说明并举例说明了它是如何解决的,而且这个问题是两年前发布的,所以我不认为他答案与当前版本的 Multer 兼容。

我探索过 "onError" function was removed long ago, and 也不会起作用。所以我们需要使用手动和简单的方法。

我有一些用于处理多个错误的小片段(简单的服务器示例)。在所有 app.use(...) 中间件之后,只需编写确切的代码块,如下所示:

const port = process.env.APP_PORT || 3001;
const http = require('http');
const express = require('express');
const app = express();

const multer = require('multer');

// Routes
// app.get('/', () => { ... });

// Handling errors for 404 not-founds
app.use((req, res) => {
    res.status(404).json({
        err_code: 404,
        err_message: "URL-endpoint not found!"
    });
});

// EXACT PART >>>
app.use((err, req, res, next) => {
    if (err instanceof multer.MulterError) { // Multer-specific errors
        return res.status(418).json({
            err_code: err.code,
            err_message: err.message,
        });
    } else { // Handling errors for any other cases from whole application
        return res.status(500).json({
            err_code: 409,
            err_message: "Something went wrong!"
        });
    }
});
// EXACT PART <<<

// Running the server
http.createServer(app);
app.listen(port, () => {
    console.log(`Server started on port ${port} !!!`);
});

此外,您可以使用这些 multer standard messages 进行自定义。