You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建帖子控制器可处理带图请求,无图请求异常

问题解决:无图片上传时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 08:10:28