I’m using this middleware to upload files into an AWS S3 bucket. However, there has been a problem: I’m unable to enter Multer’s error block while filtering the type of files in fileFilter.
const multer = require('multer');
const storage = multer.memoryStorage();
const crypto = require('crypto');
const sharp = require('sharp');
const { AwsUploadFile } = require('../../utils/s3');
const generateFileName = (mimeType, bytes = 32) => {
const extension = mimeType.split('/')[1]; // Extracts file extension from MIME type
return crypto.randomBytes(bytes).toString('hex') + '.' + extension;
};
const fileFilter = (req, file, cb) => {
if (
file.mimetype.startsWith('image/') ||
file.mimetype.startsWith('video/')
) {
cb(null, true);
} else {
cb(null, false);
}
};
const upload = multer({
storage: storage,
limits: { fileSize: 50 * 1024 * 1024 }, // 50MB limit
fileFilter: fileFilter,
});
async function fileUpload(req, res, next) {
const multerUpload = upload.any();
multerUpload(req, res, async (err) => {
if (err instanceof multer.MulterError) {
return res.status(500).json({
success: false,
message: 'Error uploading file',
error: err.message,
});
} else if (err) {
// An unknown error occurred when uploading.
console.log('General error:', err.message);
return res.status(500).json({
success: false,
message: 'An error occurred while processing',
error: err.message,
});
}
if (!req.files || req.files.length === 0) {
return res.status(400).json({
success: false,
message: 'No files uploaded',
});
}
const file = req.files[0];
const getFileName = generateFileName(file.mimetype);
file.originalname = file.mimetype.startsWith('video/')
? 'public/videos/' + getFileName
: 'public/images/' + getFileName;
if (file.mimetype.startsWith('image/')) {
try {
const fileBuffer = await sharp(file.buffer)
.resize({ height: 1920, width: 1080, fit: 'contain' })
.toBuffer();
file.buffer = fileBuffer;
} catch (sharpError) {
return res.status(500).json({
success: false,
message: 'Error processing image',
error: sharpError.message,
});
}
}
try {
const { fileLink, result } = await AwsUploadFile({
fileBuffer: file.buffer,
fileName: file.originalname,
mimeType: file.mimetype,
});
req.fileUrl = fileLink;
req.fileType = file.mimetype.split('/')[0];
next();
} catch (awsError) {
return res.status(500).json({
success: false,
message: 'Error uploading to AWS',
error: awsError.message,
});
}
});
}
module.exports = fileUpload;
If I throw an error, then I am able to get into it, but I’m unable to send these headers:
return res.status(500).json({ success: false, message: 'An error occurred while processing', error: err.message })
when i use cb(null, false) in fileFilter func, Multer skips the file without triggering an error but i want to throw an error if its not a valid file type and i need to send that invalid file type error to the client