我一直在为koa应用编写身份验证路由器.
我有一个模块,可以从数据库获取数据,然后将其与请求进行比较.如果认证通过,我只想接下来运行yield.
问题在于,与数据库通信的模块返回了一个Promise,如果我尝试在该Promise中运行下一个yield,则会收到错误消息.根据是否使用严格模式,SyntaxError:意外的严格模式保留字或SyntaxError:意外的标识符.
这是一个简化的示例:
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');
})
});
解决方法:
我想我知道了.
需要产生promise,这将暂停功能,直到promise被解决,然后继续.
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;
}
});
这似乎可行,但是如果遇到其他问题,我将对其进行更新.