我目前正在为node.js网站的授权功能。我正在使用Sequelize作为登录管理器的ORM和Passport。要启用授权功能,我想向请求对象(即["manageDelete", "manageAdd", "userManage"]
)添加授权名称数组(仅字符串)。我想在passport.deserializeUser()
方法中这样做。嵌套for each和异步
下面是一些额外的信息:
的授权都存储在MySQL数据库中的表称为authorizations
。此表与关联n to m
关系的另一个名为roles
的表关联(我最终想要实现的是将授权捆绑在一起以使管理授权更加容易)。
我有异步代码的巨大问题,因为这个话题对我来说是非常新的。我的代码来积累用户的角色的所有授权是这样的:
passport.deserializeUser(function (id, done) {
var currUser;
models.User.findById(id)
.then((user) => {
currUser = user;
//gets array of associated roles for this user
return user.getRoles();
})
.then((roles) => {
var authArr = [];
roles.forEach((role) => {
//gets array of associated authorizations for this role
role.getAuthorizations().then((auths) => {
auths.forEach((auth) => {
authArr.push(auth.name);
});
});
});
return authArr;
})
.done((authArr) => {
done(null, {user: currUser, authArr: authArr});
});
});
我知道,因为asychronosity的任何承诺都得到解决之前,done()
方法被调用,但我找不到任何方式以防止发生。我尝试了无数不同的模式(例如:https://www.joezimjs.com/javascript/patterns-asynchronous-programming-promises/或async.js'),但我无法实现它。
我在做什么错?有没有使用任何额外的模块的解决方案?帮助将不胜感激。提前致谢!
非常感谢!你的解决方案工作得很好! –