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

使用Formidable上传图片至MongoDB时CastError问题求助

解决图片上传至MongoDB的CastError及Promise未捕获问题

嘿,我一眼就揪出问题所在了,咱们一步步来搞定它:

1. 核心问题:Schema定义与更新数据不匹配

你的User Schema里,profilePic被直接定义成了Buffer类型,但你更新时传入的是一个包含data(Buffer)和contentType的对象——mongoose没法把这个对象转换成它期望的Buffer类型,所以抛出了CastError。

修正你的User Schema

把profilePic改成嵌套对象结构,明确声明data和contentType两个字段:

const userSchema = new mongoose.Schema({
  name: { type: String, trim: true, required: true, maxLength: 60 },
  email: { type: String, unique: true, trim: true, maxLength: 100 },
  password: String,
  isAdmin: { type: Boolean, default: false },
  // 修正此处的Schema定义
  profilePic: {
    data: Buffer,
    contentType: String
  },
  photos: Array
});

2. 修复未处理的Promise拒绝问题

代码里的UnhandledPromiseRejectionWarning是因为form.parse回调内的async函数出错后没有被捕获。咱们可以把回调逻辑包装成Promise,用async/await统一处理错误。

修正后的完整路由代码

const fs = require('fs'); // 确保导入fs模块
router.post("/profile-pic/:id", async (req, res, next) => {
  try {
    let user = await User.findById(req.params.id);
    if (!user) return res.status(404).send("User not found...");

    let form = new formidable.IncomingForm();
    form.keepExtensions = true;

    // 把form.parse转为Promise,方便统一处理异步逻辑
    await new Promise((resolve, reject) => {
      form.parse(req, async (err, fields, files) => {
        if (err) {
          reject(err);
          return;
        }

        try {
          if (!files.profilePic) {
            return res.status(400).send("No image file provided.");
          }

          if (files.profilePic.size > 1000000) {
            return res.status(400).send("Image can not be larger than 1MB");
          }

          await User.findByIdAndUpdate(
            { _id: user.id },
            {
              profilePic: {
                data: fs.readFileSync(files.profilePic.path),
                contentType: files.profilePic.type
              }
            },
            { useFindAndModify: false }
          );

          res.send("Image uploaded successfully.");
          resolve();
        } catch (updateErr) {
          reject(updateErr);
        }
      });
    });
  } catch (ex) {
    console.error(ex);
    res.status(500).send("Server error while uploading image.");
    // next(); // 若需要将错误传递给全局错误中间件,可保留此句
  }
});

额外提示

如果之前这段代码能正常工作,大概率是你不小心修改了profilePic的Schema定义,改回嵌套结构后就能恢复正常了。另外记得确认fs模块已经正确导入哦。

内容的提问来源于stack exchange,提问作者user12864972

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 13:02:31