Express异步路由渲染index页面触发无限循环问题咨询
问题原因
和async/await、Mongoose查询逻辑无关——你控制台能正常打印reviews结果,就说明数据库查询已经执行完成了。
问题出在res.render的传参错误:
Express的res.render接口规则是:第一个参数是模板文件名,第二个参数是传给模板的变量对象,第三个参数如果传值,只能传渲染完成后的回调函数;只要传了第三个参数,Express就不会自动把渲染好的HTML返回给客户端,必须手动在回调里发响应。
你写的res.render('index', {"userData": null}, {reviews});,相当于把{reviews}这个普通对象塞到了回调参数的位置。这个对象不是可执行函数,既跑不了回调逻辑,Express也不会自动返回页面,请求就一直挂着,看起来像无限循环。
修复方法
把所有要传给模板的变量都合并到第二个参数里,不要拆成两个对象传:
require('./database'); const Review = require('./server/models/Review'); // Index view file app.get('/index', async (req, res) => { const limitNumber = 8; const reviews = await Review.find({}).limit(limitNumber); console.log(reviews) // 所有模板变量统一放在第二个对象中传入 res.render('index', { userData: null, reviews }); });
额外说明
- 你设的limit是8,但库里只有5条数据,Mongoose会直接返回全部5条,这个逻辑不会报错。
- 除非你要自定义渲染后的处理逻辑,否则别给
res.render传第三个参数。真要用回调的话,记得在回调里手动res.send渲染好的内容,不然请求还是会挂。
内容的提问来源于stack exchange,提问作者michaelpnrs
相关产品推荐
相关产品推荐

