讓koa-hbs模組支援koa2

sagacite發表於2019-02-16

個人比較喜歡handlebars渲染,不喜歡ejs、jade之類,因此在試驗koa2開發時,第一時間就想到整合koa-hbs模組!
koa-hbs模組來自https://github.com/gilt/koa-hbs
問題是,該模組不支援koa2,就支援koa1
那麼我們就出動koa-convert模組來進行轉換……可是,仍然有問題。關鍵點在於ctx.render方法仍然是個generator函式。
這難不倒我們,翻一下koa-convert模組的原始碼,有樣學樣,用下面的辦法解決之:

const hbs = require(`koa-hbs`);
const convert = require(`koa-convert`);
const co = require(`co`);

app.use(convert(hbs.middleware({
    viewPath: __dirname + `/views`,
    partialsPath: __dirname + `/views/partials`
})));
app.use(async (ctx, next) => {
    ctx.render_ = ctx.render;
    ctx.render = function (tpl, locals) {
        return co.call(ctx, ctx.render_(tpl, locals));
    }
    await next();
})

另外,如果不用koa-hbs模組,而是用支援koa2的koa-views模組,必須用最新的5.1.2版本(此文章發表時的最新版本),或更高的版本:
npm i koa-views@5.1.2
我在一開始時使用npm i koa-views@next命令安裝,結果不是最新版本,被坑了。

相關文章