我目前正在爲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'),但我無法實現它。
我在做什麼錯?有沒有使用任何額外的模塊的解決方案?幫助將不勝感激。提前致謝!
非常感謝!你的解決方案工作得很好! –