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
    });
})

 

 

 

关于博主
骨灰级博客玩家
国内第一批90后网站站长/程序员
做过七年前端讲师
目前从事锦鲤观赏鱼电商行业
鱼贝贝锦鲤创始人
文章列表
1
bootstrap中modal模态框实现在页面中水平垂直居中的方法
bootstrap中modal模态框实现在页面中水平垂直居中的方法
2
神坑react native之打开SDK Manager.exe闪退无法打开的解决方法
神坑react native之打开SDK Manager.exe闪退无法打开的解决方法
3
Adobe Acrobat DC 2018 打开报错“adobe 在要求的应用程序库或文件中检测到错误,产品无法继续运行。请重新安装应用程序”的原因及解决方案
Adobe Acrobat DC 2018 打开报错“adobe 在要求的应用程序库或文件中检测到错误,产品无法继续运行。请重新安装应用程序”的原因及解决方案
4
微信小程序《用户服务协议》范文参考
微信小程序《用户服务协议》范文参考
5
win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案
win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案
最新评论
比比拉布
比比拉布
5月7日
太感谢了!!!!!!找了这么多的教程,只有你点出来了关键点——设计视图!!!!
Jake
Jake
3月7日
Halo 啊~麻烦更新下我的博客地址,原名:Jing Blog。麻烦更新如下: Jake Blog(后缀可以省略,也可以保留,看哪个风格适合) 网址:htt
评论于关于博主