使用Mongoose存储图片时Cast to Buffer类型转换失败问题求助
错误原因说明
- 核心问题是Schema定义和实际存入的数据结构不匹配:你在
dataSchema中将img字段的类型直接声明为Buffer,但实际接口逻辑里给img字段传入的是包含data(Buffer类型)和contentType(字符串类型)的对象,Mongoose无法将对象转换为Buffer类型,触发校验失败报错。 - 次要问题1:创建数据时逻辑重复,你先实例化了
Data模型对象,又调用Data.create()方法传入该实例,属于冗余操作,两种方法选其一即可。 - 次要问题2:异步操作没有加错误捕获逻辑,
async函数里的报错没有被try catch捕获,才会抛出未处理的Promise拒绝警告。
解决步骤
步骤1:修正Schema定义
调整img字段为嵌套结构,匹配你要存入的data、contentType两个属性:
const dataSchema = new mongoose.Schema({ name: { type: String, required: false, }, img: { data: { type: Buffer, required: false }, contentType: { type: String, required: false } } });
步骤2:修正路由保存逻辑
删除冗余的实例化操作,动态获取上传文件的真实MIME类型,不要写死为image/png:
// Post request router.post("/", upload.single("img"), async (req, res) => { try { const saveData = { name: req.body.name }; // 只有传了图片才处理img字段 if (req.file) { saveData.img = { data: fs.readFileSync(path.join(__dirname, "../uploads/" + req.file.filename)), contentType: req.file.mimetype // 动态取文件真实类型 }; // 可选:存完数据库后删除本地uploads文件夹里的临时文件,避免占用磁盘空间 fs.unlinkSync(path.join(__dirname, "../uploads/" + req.file.filename)); } await Data.create(saveData); res.send({status: "success", data: req.body}); } catch (err) { // 捕获错误返回给前端 res.status(500).send({status: "error", message: err.message}); } });
可选优化
如果不需要强制把图片存在数据库里,更推荐的方案是只把图片的访问路径存在数据库,静态资源交给express托管,读写性能比存在数据库Buffer里高很多。
内容的提问来源于stack exchange,提问作者Tek Kshetri
相关产品推荐
相关产品推荐

