Node.js+Koa2+art-template ctx.render()方法提示Not Found解决方案
一个Node.js项目采用了Node.js+Koa2+art-template架构,在路由中利用ctx.render()方法渲染模板的时候,浏览器中访问提示Not Found。
错误写法如下;
router.get('/',(ctx,next)=>{ msgModel.find({},(err,data)=>{ ctx.render('app',{ data:data }); }) })
经老孙测试,发现只要是在函数中执行ctx.render()方法渲染模板就会提示Not Found,如果直接在get的回调函数中使用是没有问题的,最终将问题定位到模板内部渲染机制的原因。
利用es7中的async await语法将get中的异步函数变成同步,代码如下:
router.get('/',async (ctx,next)=>{ let d; await msgModel.find({},(err,data)=>{ d = data; }) ctx.render('app',{ data:d }); })
如上代码基本能解决问题,但是刷新页面偶尔会出现数据空白的问题,归结原因还是因为find()方法其实是一个Promise对象,当数据查询完毕后就会执行resolve()变为完成状态,所以,ctx.render()并一定会在find()方法的回调函数后执行。
最终按照如下方式,问题解决:
router.get('/',async (ctx,next)=>{ let data = await msgModel.find({}); ctx.render('app',{ data:data }); })