【问题标题】:How can I handle exceptions using Multer if I need to use middlewares after uploading a file如果上传文件后需要使用中间件,如何使用 Multer 处理异常
【发布时间】:2021-11-02 12:05:46
【问题描述】:

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 Stackoverflow 但没有正确指定并举例说明了它是如何解决的,此外这个问题是两年前发布的,所以我认为他的答案与当前版本不兼容穆尔特。

【问题讨论】:

    标签: node.js express file-upload multer


    【解决方案1】:

    我很久以前就探索过"onError" function was removed,而this 也无法正常工作。因此,我们需要使用手动且简单的方法。

    我有一些小的 sn-p(简单的服务器示例)用于处理 multer 错误。只需在所有 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 进行自定义。

    【讨论】:

    • 谢谢,sn-p 帮了我很多。但是,我并没有完全按照您的操作方式使用它,而是使用您的代码创建了一个新的中间件,并在 multer 部分之后插入中间件链以上传文件 `` app.post('/profile', [upload.single ('file'),middlewareFunctions.handlingMulter,middlewareFunctions.Authenticate,middlewareFunctions.getDataUploadedFile], function (req, res) { }) ``` 其中 middlewareFunctions.handlingMulter 是你在另一个文件中的 sn-p
    • 重构你的项目文件很好。我认为this 可能对你和我都有用:)
    猜你喜欢
    • 2020-09-10
    • 2021-08-11
    • 2019-07-31
    • 2019-04-06
    • 2021-08-04
    • 2016-07-12
    • 2020-03-25
    • 2012-04-23
    相关资源
    最近更新 更多