【问题标题】:Error handling when uploading file using multer with expressjs使用带有 expressjs 的 multer 上传文件时的错误处理
【发布时间】:2015-08-30 13:53:23
【问题描述】:

我正在使用multer 将文件保存在通过 express 和 nodejs 开发的服务器上。

我正在使用以下代码。

var express = require('express'),
    multer  = require('multer')

var app = express()

app.get('/', function(req, res){
  res.send('hello world');
});

app.post('/upload',[ multer({ dest: './uploads/'}), function(req, res){

    res.status(204).end()
}]);

app.listen(3000);

Multer 为我将文件保存在指定的目标文件夹中。

一切正常,但我有以下问题:

  1. 如果由于各种原因文件保存失败,我的路由似乎总是返回状态 204。
  2. 我不确定是在保存文件后返回状态 204 还是在异步保存文件时返回状态 204。

【问题讨论】:

    标签: node.js express multer busboy


    【解决方案1】:

    这是编写处理上传和错误的multer中间件的方法

    const multer = require("multer");
    
    function uploadFile(req, res, next) {
        const upload = multer().single('yourFileNameHere');
    
        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. 
            next()
        })
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用onError 选项处理错误:

      app.post('/upload',[
        multer({
          dest    : './uploads/',
          onError : function(err, next) {
            console.log('error', err);
            next(err);
          }
        }),
        function(req, res) {
          res.status(204).end();
        }
      ]);
      

      如果您调用next(err),您的路由处理程序(生成 204)将被跳过,错误将由 Express 处理。

      认为(不是 100% 确定,因为这取决于 multer 的实现方式)保存文件时将调用您的路由处理程序。您可以使用onFileUploadComplete 在上传完成后记录一条消息,并将其与调用路由处理程序时进行比较。

      查看代码,multer 在文件完全上传后调用下一个中间件/路由处理程序。

      【讨论】:

      【解决方案3】:

      试试这个

      var upload = multer().single('avatar')
      
      app.post('/profile', function (req, res) {
        upload(req, res, function (err) {
          if (err) {
            // An error occurred when uploading 
            return
          }
      
          // Everything went fine 
        })
      }
      

      参考:

      http://wiki.workassis.com/nodejs-express-get-post-multipart-request-handling-example/

      https://www.npmjs.com/package/multer#error-handling

      【讨论】:

        【解决方案4】:

        从下面的代码(来自muter index.js文件的源代码)可以看出,如果你没有传递onError回调,错误将由express处理。

            fileStream.on('error', function(error) {
              // trigger "file error" event
              if (options.onError) { options.onError(error, next); }
              else next(error);
            });
        

        【讨论】:

          【解决方案5】:

          当用户向您发送任何内容时,请注意系统

          我通常设置更多[*option1]:

          process.on('uncaughtException', function(ls){
            // console.log(ls);
            (function(){})();
          });
          

          然后:

          var upload= multer({ dest: __dirname + '/../uploads/' }).single('photos');
          // middle ..
          upload(req, res, function (err) {
            if (err instanceof multer.MulterError) {
              // A Multer error occurred when uploading.
              console.log('MulterError', err);
            } else if (err) {
              // An unknown error occurred when uploading.
              // Work best when have [*option1]
              console.log('UnhandledError', err);
            }
            if(err) {
              return res.sendStatus(403);
            }
            res.sendStatus(200);
          });
          

          包:“multer”:“^1.4.2”

          【讨论】:

            【解决方案6】:
            var multer = require('multer')
            var upload = multer().single('avatar')
             
            app.post('/profile', function (req, res) {
              upload(req, res, function (err) {
                if (err instanceof multer.MulterError) {
                  handle error
                } else if (err) {
                  handle error
                }
                else{
                  write you code
                }
              })
            })
            
            
            you can see this from the [documentation][1]
            
            
              [1]: https://www.npmjs.com/package/multer#error-handling
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-02-26
              • 2016-08-11
              • 2018-05-27
              • 2016-03-06
              • 1970-01-01
              • 2015-02-01
              • 2018-09-04
              • 1970-01-01
              相关资源
              最近更新 更多