blog项目:在mongoose中进行populate联合查询导致模板无法渲染—解决报错信息之SyntaxError: Unexpected token R in JSON at position 0

报错信息

出错代码

    let articles = await Article.find().populate('author');
    res.render('admin/article', { articles });

出错原因

      在mongoose中使用populate方法实现集合关联时,导致模板引擎无法渲染,这是因为当集合联合查询和渲染页面模板同时进行会导致两者冲突,从而导致无法渲染页面,例如我们把上面的代码改成如下这样:

    let articles = await Article.find().populate('author');
    res.send('ok');    // 服务端能够给客户端响应 ok 所以模板渲染与联合查询确实存在冲突

解决方法

1. 使用lean()方法

    let articles = await Article.find().populate('author').lean();
    res.render('admin/article', { articles });

      lean()方法:是告诉mongoose返回的是普通对象,而不是mongoose文档对象,方法内部先用JSON.stringify()这个方法将文档对象转换为字符串,将其他的属性格式全部去掉,然后只留下需要的数据字符串~

2. 使用stringfy()和 parse()方法

      和上面的方法实质上是一样的.

    let articles = await Article.find().populate('author');
    let str = JSON.stringify(result);
    let json = JSON.parse(str);
    res.render('admin/article', { json });

而在继续进行分页功能的时候,我们可以采用JSON方法

      实现分页功能的时候,我们采用了mongoose-sex-page第三方模块进行分页,然后我们将代码改成:

let temp = await pagination(Article).find({})
    .page(page)
    .size(2)
    .display(2).populate('author')
    .exec();
let articles = JSON.parse(JSON.stringify(temp));
res.render('admin/article', { articles });

问题就解决啦😀

参考博客https://blog.csdn.net/qq_49002903/article/details/112541719

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值