使用带有 expressjs 的 multer 上传文件时的错误处理

Posted

技术标签:

【中文标题】使用带有 expressjs 的 multer 上传文件时的错误处理【英文标题】:Error handling when uploading file using multer with expressjs 【发布时间】: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 为我将文件保存在指定的目标文件夹中。

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

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

【问题讨论】:

【参考方案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 在文件完全上传后调用下一个中间件/路由处理程序。

【讨论】:

onError 在 Multer 1.0.0 中被删除。 我找到了一个新的 multer 版本的工作代码:github.com/expressjs/multer/issues/336#issuecomment-242906859 onError 的替代品是什么? @HosMercury github.com/expressjs/multer#error-handling multer上传成功,route handler失败如何处理?【参考方案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

【讨论】:

以上是关于使用带有 expressjs 的 multer 上传文件时的错误处理的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ExpressJS 和 multer 中将数据从一个路由器传递到另一个路由器?

使用 Node Multer 缓冲区获取 Blob 并将 Blob 转换为 Base 64

如何使用 Multer 提交带有可选文件提交的表单?

使用 Multer 将带有 fetch 的图像上传到 Express

使用带有 cloudinary api 的 multer 库

NodeJs异步上传multer插件报Multipart: Boundary not found错误解决方法