Обрабатывать ошибку множественного размера файла при загрузке больших файлов

#node.js #express #file-upload #multer

#node.js #экспресс #загрузка файла #множественный

Вопрос:

Я загружаю файлы с помощью multer на свой сервер и при загрузке с использованием limits: { fileSize: 3000000 } я ограничиваю размер файла до 3 МБ. Теперь проблема, с которой я сталкиваюсь, заключается в том, что при загрузке файла большего размера я получаю MulterError: File too large at abortWithCode сообщение об ошибке, и мой сервер прерывается и выходит из строя. Я пытался использовать if (err instanceof multer.MulterError) { console.log("file too large")} и использовать upload в качестве промежуточного программного обеспечения для обработки ошибки, но, похоже, это не работает, и мой сервер продолжает сбоить при загрузке файла большего размера. Есть идеи, как справиться с ошибкой??? Я не хочу, чтобы мой сервер зависал и отправлял ошибку в качестве ответа на API

Маршрутизатор:

 const multer = require("multer");

const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, "./uploads");
  },
  filename: function (req, file, cb) {
    cb(null, Date.now()   file.originalname);
  },
});

const upload = multer({ storage: storage, limits: { fileSize: 2000000 } });

module.exports.setRouter = (app) => {
  app.post("/create", upload.single("imageUrl"), userController.createUser);
}
 

Функция контроллера:

 let createUser = (req, res) => {
  let newUser = new UserModel({
    name: req.body.name,
    email: req.body.email,
    password: passwordLib.hashpassword(req.body.password),
    imageUrl: req.file.path,
  });

  // saving the new user
  newUser.save((err, result) => {
    if (err) {
      console.log(err);
      res.send(err);
    } else {
      res.send(result);
    }
  });
};
 

app.js

 const express = require("express");
const app = express();
app.use("/uploads", express.static("uploads"));
 

Ответ №1:

Вы можете перехватить ошибку с помощью дополнительного обработчика ошибок, который выполняется после multer .

 const multer = require('multer')
const fileSizeLimitErrorHandler = (err, req, res, next) => {
  if (err) {
    res.send(413)
  } else {
    next()
  }
}

const storage = multer.diskStorage({
  destination: function(req, file, cb) {
    cb(null, './uploads')
  },
  filename: function(req, file, cb) {
    cb(null, Date.now()   file.originalname)
  },
})

const upload = multer({ storage: storage, limits: { fileSize: 2000000 } })

module.exports.setRouter = (app) => {
  app.post('/create', upload.single('imageUrl'), fileSizeLimitErrorHandler, userController.createUser)
}
 

Комментарии:

1. Это решило мою проблему. Ограничение размера файла обрабатывается.

Ответ №2:

используйте это

 const upload = multer({ storage: storage,
                        limits: { fileSize: 2000000 },
                        fileFilter: function(req, file, cb){
                            checkFileType(file, cb)
                        }
                        });




function checkFileType(file, cb){
    // Allowed ext
    const filetypes = /jpeg|jpg|png/;

    //check ext
    const extname = filetypes.test(path.extname(file.originalname).toLowerCase());

    //check mime
    const mimetype = filetypes.test(file.mimetype);

    if(mimetype amp;amp; extname){
        return cb(null, true);
    }else{
        cb('Error')
    }
}
 

контроллер

 let createUser = (req, res) => {
    upload(req, res, (err) => {
    if (err) res.send(err);
    })

//the rest (saving new user) here
};
 

Комментарии:

1. как отправить эту «ошибку» в качестве ответа API