【问题标题】:Handling errors in multer?处理multer中的错误?
【发布时间】:2021-11-28 08:25:08
【问题描述】:

对于错误处理 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 文件夹。

【问题讨论】:

  • Multer 有一个fileFilter 选项来检查是否应该上传文件
  • @reyno 我想在用户上传错误的文件类型或文件大小超出时显示自定义错误消息?

标签: javascript node.js express multer


【解决方案1】:

对于自定义错误消息,您可以在此处通过此控制器进行检查如果图像和产品将保存在数据库中,则通过所有条件后的条件

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);
    });
};

【讨论】:

    猜你喜欢
    • 2017-10-25
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    • 2016-06-22
    • 2021-08-29
    • 2016-05-05
    • 2016-09-14
    • 2021-09-09
    相关资源
    最近更新 更多