我很难为koa应用程序编写身份验证路由器。
我有一个模块从数据库获取数据,然后将其与请求进行比较。如果身份验证通过,我只想运行yield next
。
问题是与DB通信的模块会返回一个promise,如果我尝试在该promise中运行yield next
,我会收到错误。 SyntaxError: Unexpected strict mode reserved word
或SyntaxError: 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');
})
});
答案 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