上传大于 maxLimit 的文件时,Multer 文件上传请求陷入“待处理”状态

问题描述 投票:0回答:1

我有一个 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;
node.js mongodb express mern multer
1个回答
0
投票

您可以隐式和显式地处理这个问题。

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)' });
                }
            }
© www.soinside.com 2019 - 2024. All rights reserved.