在Async函数中为Order对象添加fileUrl属性不生效问题求助
问题解决:给Mongoose Order对象添加自定义属性不显示
原因分析
你通过Order.find()获取到的order是Mongoose文档对象,而非普通JavaScript对象。这类对象受Schema约束,默认无法直接添加Schema中未定义的属性,即便赋值了也不会被序列化输出(比如console.log或返回给前端时不会显示)。
解决方案
提供三种可行的解决方式,按需选择:
1. 将文档转为普通JS对象(最常用)
在处理前调用toObject()方法把Mongoose文档转为普通对象,之后就可以自由添加属性:
router.get('/my-orders/:id', isAuth, async (req, res) => { const id = req.params.id; try { const orders = await Order.find({ userId: id }); if (orders.length > 0) { const modifiedOrders = []; for (const order of orders) { // 转为普通对象 const orderObj = order.toObject(); const getObjectParams = { Bucket: bucketName, Key: orderObj.fileName, } const command = new GetObjectCommand(getObjectParams); const url = await getSignedUrl(s3, command, { expiresIn: 3600 }); // 添加自定义属性 orderObj.fileUrl = url; console.log(orderObj); // 现在能看到fileUrl属性 modifiedOrders.push(orderObj); } res.send(modifiedOrders); // 返回处理后的对象数组 } else { res.send([]); } } catch (error) { console.error(error); res.status(500).send('Server Error'); } })
2. 查询时直接返回普通对象(lean())
在查询语句后添加.lean(),Mongoose会直接返回普通JS对象,无需额外转换:
// 修改查询语句 const orders = await Order.find({ userId: id }).lean(); // 之后可以直接给order添加属性 for (const order of orders) { // ...获取url的逻辑 order.fileUrl = url; console.log(order); // 正常显示属性 }
3. 修改Schema添加字段(如需持久化)
如果fileUrl需要存入数据库,可以直接在Order的Schema中添加该字段:
const orderSchema = new mongoose.Schema({ // 原有字段... fileName: String, fileUrl: String // 添加这个字段 }); const Order = mongoose.model('Order', orderSchema);
之后直接给order.fileUrl赋值即可,属性会正常显示,且能保存到数据库。
内容的提问来源于stack exchange,提问作者LAHOUCINE IJIOUI
相关产品推荐
相关产品推荐

