nodejs操作 mongoose(mongodb)和Sequelize(mysql)查询数据后添加新属性未生效

最近在着手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 }复制代码


  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值