#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