【发布时间】:2016-07-07 08:50:26
【问题描述】:
我目前正在为 node.js 网站开发授权功能。我正在使用 Sequelize 作为 ORM 和 Passport 作为登录管理器。为了启用授权功能,我想向请求对象(即["manageDelete", "manageAdd", "userManage"])添加一个授权名称数组(只是字符串)。我想在passport.deserializeUser() 方法中做到这一点。
以下是一些附加信息:
授权存储在名为authorizations 的 MySQL 数据库表中。该表在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});
});
});
我知道由于异步性,done() 方法在任何承诺解决之前被调用,但我找不到任何方法来防止这种情况发生。我尝试了无数不同的模式(例如:https://www.joezimjs.com/javascript/patterns-asynchronous-programming-promises/ 或 async.js'),但我无法让它工作。
我做错了什么?有没有不使用任何附加模块的解决方案?帮助将不胜感激。提前致谢!
【问题讨论】:
标签: javascript node.js asynchronous sequelize.js