Para el manejo de errores, multer sugiere
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. }) })Escribí un middleware personalizado para cargar diferentes tipos de archivos.
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() }) } }) Si no hay ningún error, solo necesito cargar el archivo en la carpeta de uploads . Cuando subo un archivo que no sea jpeg o jpg, recibo un mensaje de error que dice que solo se permiten jpeg, jpg. Esto es lo que necesito. Pero el problema es que el archivo también se uploads en la carpeta de carga.
Para los mensajes de error personalizados, puede pasar por este controlador aquí. Estoy verificando el tipo de archivo al cargar una imagen y en el controlador, si no hay un archivo seleccionado en ese momento, estoy enviando un mensaje personalizado con simple si la condición después de pasar todo si la imagen y los productos se guardarán en DB
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); }); };