你如何在承诺或回调中运行`yield next`?

时间:2015-12-21 18:42:32

标签: javascript generator koa koa-router

我很难为koa应用程序编写身份验证路由器。

我有一个模块从数据库获取数据,然后将其与请求进行比较。如果身份验证通过,我只想运行yield next

问题是与DB通信的模块会返回一个promise,如果我尝试在该promise中运行yield next,我会收到错误。 SyntaxError: Unexpected strict mode reserved wordSyntaxError: Unexpected identifier取决于是否使用严格模式。

这是一个简单的例子:

var authenticate = require('authenticate-signature');

// authRouter is an instance of koa-router
authRouter.get('*', function *(next) {
  var auth = authenticate(this.req);

  auth.then(function() {
    yield next;
  }, function() {
    throw new Error('Authentication failed');
  })
});

2 个答案:

答案 0 :(得分:4)

我想我已经明白了。

需要产生承诺,这将暂停功能,直到承诺得到解决然后继续。

var authenticate = require('authenticate-signature');

// authRouter is an instance of koa-router
authRouter.get('*', function *(next) {
  var authPassed = false;

  yield authenticate(this.req).then(function() {
    authPassed = true;
  }, function() {
    throw new Error('Authentication failed');
  })

  if (authPassed)  {
   yield next;
  }
});

这似乎有效,但如果我遇到更多问题,我会更新。

答案 1 :(得分:-1)

您只能在生成器中使用yield,但必须传递给Promise then的回调才是正常功能,这就是为什么你得到一个SyntaxError。

您可以按以下方式重写:

var authenticated = yield auth.then(function() {
    return true;
}, function() {
    throw new Error('Authentication failed');
})

if (authenticated) yield next