报错信息
出错代码
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