javascript - 处理multer中的错误?
问题描述
对于错误处理 multer 建议
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.
})
})
我编写了一个自定义中间件来上传不同类型的文件。
const { check } = require("express-validator")
const multer = require('multer')
const mime = require('mime-types')
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, 'uploads/')
},
filename: function (req, file, cb) {
const filename = Date.now()+"-"+file.originalname
cb(null, filename)
}
})
const upload = multer({ storage: storage })
const uploadFile = (fieldname,filetypes,fileSize)=>{
return (req,res,next)=>{
let file = upload.single(fieldname)
file(req,res,function(err){
if (err instanceof multer.MulterError) {
req.fileError = {
param: "image",
msg: "Unable to process request"
}
return next()
} else if (filetypes.includes(mime.extension(req.file.mimetype)) === false) {
req.fileError = {
param: "image",
msg: `Only ${filetypes.toString()} allowed`
}
return next()
} else if (req.file.size > fileSize) {
req.fileError = {
param: "image",
msg: `File size should not exceed ${formatBytes(req.file.size)}`
}
return next()
}
})
}
}
course_validator = [
check("name")
.trim()
.isLength({min:3,max:100})
.withMessage("Course name should be between 3 to 100 characters")
]
app.get("/create/post",uploadFile("image",["jpeg","jpg"],122880),(req,res)=>{
const errors = validationResult(req)
if(!errors.isEmpty()){
return res.json({
status: false,
error: req.fileError ? [...errors.array(),req.fileError] : errors.array()
})
}
})
如果没有错误,那么我只需要将文件上传到文件uploads
夹。当我上传除 jpeg 或 jpg 以外的其他文件时,我收到错误消息,即仅允许 jpeg,jpg。这就是我需要的。但问题是文件也被上传到uploads
文件夹。
解决方案
对于自定义错误消息,您可以在此处通过此控制器我在上传图像时检查文件类型,并且在控制器中,如果当时没有选择文件,我将发送一条自定义消息,其中包含简单的 if 条件通过后如果图像和产品都将保存在数据库中
exports.postProduct = (req, res, next) => {
const title = req.body.title;
const image = req.file;
const price = req.body.price;
const description = req.body.description;
if (!image) {
return res.status(422).render("admin/add-product", {
pageTitle: "Add Product",
path: "/adminproducts",
hasError: true,
product: {
title: title,
price: price,
description: description,
},
errorMessage: "Atteched file is not an image!!!",
validationErrors: [],
});
}
const imageUrl = image.path;
const product = new Product({
title: title,
imageUrl: imageUrl,
price: price,
description: description,
userId: req.user,
});
product
.save()
.then((results) => {
console.log("Product Created Successfully");
res.redirect("/admin/products");
})
.catch((err) => {
console.log(err);
});
};
推荐阅读
- java - 如何在 Spring MVC 中使用 Firebase Admin SDK
- mysql - MySql - RegEx 提取可变数字序列
- mongodb - MongoDB WiredTiger 错误:WiredTiger.turtle:句柄打开:打开:不允许操作
- r - ggplot:带有翻转和对数变换坐标的箱线图
- java - docker-compose + spring boot 几个应用程序不连接
- xamarin.ios - 不是给定文化的有效日历。参数名称:值
- r - 根据值从数据框中删除行,忽略 NA
- ios - 是否可以将谷歌日历添加到 iOS 应用程序?
- oracle-apex - 使用 apex_web_service.make_rest_request 在 oracle apex 中调用 Oracle EBS 标准 Web 服务
- azure-ad-graph-api - O365:TenantUsage_getOffice365ActiveUserDetail 一周未更新?