如何让ejs支持async/await

原生的ejs是不是支持在ejs使用await locals.fn()这样的方法的

查找了一圈,也没有找到有现存的轮子,没有方法,硬着头皮,一点点的看ejs的源码。 最后终于解决了

具体的思路是 在function之前将代码转成es5的代码 这儿使用到了babel 的api

  var code = 'var __fn = async  function(' + opts.localsName + ', escapeFn, include, rethrow){' + src + '}'
            debug("\r\n", code, "\r\n")

            var result = babel.transform(code, {
                "babelrc": false,
                "presets": ['es2015-node5', 'stage-3'],
                "plugins": [
                    ["transform-strict-mode", {
                        "strict": false
                    }]
                ]
            });

            debug("\r\n");
            debug("src");
            debug(result.code);
            debug("\r\n");
            fn = new Function(opts.localsName + ', escapeFn, include, rethrow', result.code.replace('"use strict";', "") + ";return __fn");

这样在node 6以下版本就不会出现异常了

在node 8以上,就不用写这么复杂 new Function已经支持 async/await.