使用带有 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 将带有 fetch 的图像上传到 Express