使用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
相关产品推荐
相关产品推荐

