我有一个 Node.js 应用程序,其中使用 Multer 来处理使用 GridFS 存储将文件上传到 MongoDB 数据库。我在上传中间件中使用 Multer 的限制选项将文件大小限制设置为 5MB。
但是,当我尝试上传大于 5MB 的文件时,发送到服务器的 POST 请求将永远陷入“待处理”状态。服务器没有响应,请求永远不会完成。
我想知道如何修改我的代码,以便可以检测何时上传大于 5MB 的文件并做出适当响应,例如提供超出大小限制的文件的名称。
任何有关如何处理此问题的见解或建议将不胜感激。
请求处理程序:-
router.post('/courses/:courseId/attachments', authenticateInstructor, async (req, res) => {
try {
const courseId = req.params.courseId;
const course = await Course.findById(courseId);
if (!course) {
return res.status(404).json({ message: 'Course not found' });
}
const instructor = await Instructor.findOne({ email: req.instructor.email });
if (course.instructor.toString() !== instructor._id.toString()) {
return res.status(403).json({ message: "Course with this instructor not found" });
}
uploadFiles.array('files', 5)(req, res, async (err) => {
if (err) {
console.error(err);
return res.status(400).json({ message: 'Error uploading files' });
}
const files = req.files;
const attachments = [];
for (const file of files) {
const attachment = await Attachment.create({
name: file.originalname,
fileId: file.id,
courseId,
});
attachments.push({
id: attachment._id,
url: `http://localhost:3000/files/${attachment.fileId}`,
name: attachment.name
});
course.attachments.push(attachment);
}
course.save();
res.status(200).json({
message: 'Files uploaded successfully',
attachments
});
});
} catch (error) {
console.error(error);
res.status(500).json({ error: 'Internal server error' });
}
});
uploadFiles.js:-
const multer = require("multer");
const { GridFsStorage } = require("multer-gridfs-storage");
const storage = new GridFsStorage({
url: process.env.MONGODB_CONNECTION_STRING + "Courses",
file: (req, file) => {
return {
filename: `${Date.now()}-${file.originalname}`,
bucketName: 'files'
}
}
});
const upload = multer({
storage,
limits: { fileSize: (5 * 1024 * 1024) }
});
module.exports = upload;
您可以隐式和显式地处理这个问题。
1.) 通过添加文件存储预检查
或者
2.)通过使用像这样的内置乘法器错误。
if (err instanceof multer.MulterError) {
if (err.code === 'LIMIT_FILE_SIZE') {
return res.status(400).json({ message: 'File size exceeds the limit (5MB)' });
}
}