最近在着手koa时候,发现mongoose(mongodb)查询数据库后添加新属性,前端拿不到新属性问题,
然后测试了一下Sequelize(mysql),发现也有同样的问题存在。此时着手干!
1.1 mongoose问题展示:
1 router.get('/order_show', async (ctx, next) => { 2 const id = ctx.query.id 3 try { 4 let doc = await Order.findOne({ _id: id }).populate(['buyid', 'address']) 5 doc.goods.forEach(async (item, index) => { 6 const goodsdata = await Goods.findOne({ id: item.id }) 7 doc.goods[index].list = goodsdata 8 }) 9 if (!doc) { 10 await ctx.render('order/order_show', { orderInfo: null }) 11 return false 12 } 13 await ctx.render('order/order_show', { orderInfo: doc }) 14 } catch (err) { 15 console.log(err) 16 await ctx.render('order/order_show', { orderInfo: null }) 17 } 18 19 })
问题:以上案例,获取订单详情信息,要查询出订单详情里面每条商品的数据,先查询出来该订单的数据,然后循环订单数据里面商品数组,再根据数组去根据每一个id去获取对应的商品数据。
获取到商品数据后,这时候就想追加到原来获取到的商品数组里面的每一项的list属性里面,但时候这时候发现,直接设置并没有效果哦!
很诡异吧,但是经过查询了mongoose文档之后,才发现原来mongoose查询出来的数据发现访问以上域名的时候,前台模板并没有list这个属性。
经过查询mongoose 文档,知道mongoose查询出来的对象是document对象,并不是普通的javascript对象,所以设置list属性并未生效。
1.2 mongoose(mongodb)解决方法:
将document对象转换为普通的javascript对象,我们可以使用mongoose的Document.prototype.toObject()
方法进项转换。修改代码如下:
经过先把document对象转换为普通javascript对象之后,我们就可以使用js object的方法去设置新属了。
1 router.get('/order_show', async (ctx, next) => { 2 const id = ctx.query.id 3 try { 4 let doc = await Order.findOne({ _id: id }).populate(['buyid', 'address']) 5 doc = doc.toObject() // 修改这里就可以,将doc
转换为Object
对象 6 doc.goods.forEach(async (item, index) => { 7 const goodsdata = await Goods.findOne({ id: item.id }) 8 doc.goods[index].list = goodsdata 9 }) 10 if (!doc) { 11 await ctx.render('order/order_show', { orderInfo: null }) 12 return false 13 } 14 await ctx.render('order/order_show', { orderInfo: doc }) 15 } catch (err) { 16 console.log(err) 17 await ctx.render('order/order_show', { orderInfo: null }) 18 } 19 20 })
测试了mongoose 操作mongodb的问题之后,接着我就试了mysql的工具 Sequelize的,设置新属性,并没有效果。
2.1 Sequelize问题展示:
1 for (let i = 0; i < goods.length; i++) { 2 let brandInfo = await Brand.findById(goods[i].brand_id) 3 goods[i].brandInfo = brandInfo 4 }
问题:以上案例,user_info这个属性并没有添加上去。
去查询了Sequelize的文档,查询到这个方法可以去操作查询出来的数据结构变化:
setDataValue(key, value)
2.2 Sequelize(mysql)解决方法:
1 for (let i = 0; i < goods.length; i++) { 2 let brandInfo = await Brand.findById(goods[i].brand_id) 3 goods[i].setDataValue( 'brandInfo', brandInfo ) 4 }