从KOA中间件中的承诺中调用yield

时间:2016-04-26 02:17:17

标签: node.js promise yield es6-promise koa

我正在编写一个KOA中间件来从mongo中提取用户信息,如果它没有被缓存的话。我收到以下错误:

" this.getUser"函数返回一个ES6承诺,如果没有使用请求缓存,则从mongo获取用户或创建一个新的匿名用户。

module.exports = function* securityMiddleware(next) {

    this.getUser(this.request)
        .then((user)=>{
            if(user.isAonymous){
                //throw 401 access error
            }else{
                yield next;
            }
        });

};

它无效,因为:jshint说生成器必须有一个yield并抛出一个SyntaxError:意外的严格模式保留字。

你如何在KOA中间件生成器中使用promises?我正在使用KOA v1.2.0。

2 个答案:

答案 0 :(得分:2)

只是在@ Bergi的回答中添加更多内容。

KoaJS中使用的生成器函数不是纯JS生成器。 Koa使用下面的co包裹生成器,它使用生成器(https://github.com/tj/co)模拟async/await语义。

co - 包装的生成器只能生成特定类型的Yieldables(包括Promise);并在后台异步处理它们并将结果值(或错误)返回给生成器函数。

答案 1 :(得分:1)

你没有yield内部承诺回调(不是生成器函数)。相反,你应该只是yield承诺本身!

module.exports = function* securityMiddleware(next) {
    var user = yield this.getUser(this.request);
    if (user.isAnonymous) {
        // throw 401 access error
    } else {
        yield next;
    }
};