最近在着手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 }