创建帖子控制器可处理带图请求,无图请求异常
问题解决:无图片上传时Post控制器逻辑异常的修复
问题根因
使用multer的upload.single("file")时,未上传文件的情况下req.file的值是undefined而非null。你原来的判断条件if (req.file !== null)会把undefined判定为不等于null,导致错误进入文件处理逻辑,引发无图场景的异常。
解决方案
把所有判断req.file !== null的地方,替换成更严谨的存在性检查,比如:
- 直接用
if (req.file)(利用JS真值判断,undefined会被视为false) - 或者
if (req.file != null)(同时排除null和undefined)
修改后的代码示例
post.controller.js(createPost部分)
module.exports.createPost = async (req, res) => { let fileName; // 替换判断条件,检查req.file是否存在 if (req.file) { try { if ( req.file.mimetype != "image/jpg" && req.file.mimetype != "image/png" && req.file.mimetype != "image/jpeg" ) throw Error("invalid file"); if (req.file.size > 500000) throw Error("max size"); } catch (err) { const errors = uploadErrors(err); return res.status(201).json({ errors }); } fileName = req.body.posterId + Date.now() + ".jpg"; try { await sharp(req.file.buffer) .resize({ width: 150, height: 150 }) .toFile(`${__dirname}/../client/public/uploads/posts/${fileName}`); } catch (err) { res.status(400).send(err); } } const newPost = new postModel({ posterId: req.body.posterId, message: req.body.message, // 同样替换这里的判断 picture: req.file ? "./uploads/posts/" + fileName : "", video: req.body.video, likers: [], comments: [], }); try { const post = await newPost.save(); return res.status(201).json(post); } catch (err) { return res.status(400).send(err); } };
额外说明
multer默认配置下:
- 上传符合要求的文件时,
req.file是包含文件信息的对象 - 未上传文件时,
req.file为undefined - 仅在配置了
dest或storage但文件存储失败时,才可能出现req.file为null的情况
所以用if (req.file)是最简洁且准确的判断方式。
内容的提问来源于stack exchange,提问作者SamCoding
相关产品推荐
相关产品推荐

