aui / art-template

High performance JavaScript templating engine
https://aui.github.io/art-template/
MIT License
9.86k stars 2.68k forks source link

如何捕获render()的错误 #450

Open Janking opened 7 years ago

Janking commented 7 years ago

koa2的环境下,我用ctx.render()渲染一个不存在的模板时,报这个错误 TemplateError: template not found: ENOENT: no such file or directory

我想要捕获这个错误,然后跳转到404或者500,该怎么处理??

aui commented 7 years ago

关闭 debug 模式?

Janking commented 7 years ago

我是在koa-router里面判断

代码如下

router.get('/user',async (ctx) =>{ await ctx.render('aaaa') } )

关闭debug,页面输出 template error,状态码200

Janking commented 7 years ago

通过这种方式解决我的问题

  try {
    ctx.render(src, {
      title: title[type],
      type: type
    })
  } catch (err) {
    ctx.state.errMsg = err.toString()
    await next()
  }

只是这样感觉很不优雅。

aui commented 7 years ago

有何更好的建议?

Janking commented 7 years ago

render()方法并没有返回任何值,我的理想状态(不成熟想法)是这样:

router.get('/user/index',async (ctx,next)=>{
 async ctx.render(‘user/index’).catch((err)=>{await next()})
})
Janking commented 7 years ago

最近在阅读 art-template 的源码,如果能看懂,会提个pr

Janking commented 7 years ago

我在这个位置加了async,是可以解决我的问题,你看看合不合理? https://github.com/aui/koa-art-template/blob/master/src/index.js#L30

// koa-art-template/index.js
 app.context.render = async function (view, _context) {// ...}
//my js file
router.get('/user/index',async (ctx,next)=>{
 ctx.render(‘user/index’).catch((err)=>{await next()})
})

不好意思,前面忘了补充我用的是koa-art-template,跑错地方来提issue了。

aui commented 7 years ago

很不错👍 我再学习下其他koa模板引擎看看它们如何处理错