Ich arbeite derzeit an einer Autorisierungsfunktionalität für eine node.js Website. Ich arbeite mit Sequelize als ORM und Passport als Login-Manager. Um die Autorisierungsfunktionalität zu aktivieren, möchte ich dem Anforderungsobjekt (d. H. ["manageDelete", "manageAdd", "userManage"]
) ein Autorisierungsname-Array (nur Zeichenfolgen) hinzufügen. Ich möchte das in der passport.deserializeUser()
Methode tun. HierVerschachtelt fürEach und Asynchronität
ist einige zusätzliche Informationen:
Die Berechtigungen in einer MySQL-Datenbank-Tabelle gespeichert werden authorizations
genannt. Diese Tabelle ist einer anderen Tabelle mit der Bezeichnung roles
in einer n to m
Beziehung zugeordnet (was ich letztendlich erreichen möchte, ist, die Berechtigungen zu bündeln, um die Verwaltung der Berechtigungen zu vereinfachen).
Ich habe große Probleme mit Async-Code, weil dieses Thema für mich sehr neu ist. Mein Code alle Berechtigungen der Rollen eines Benutzers zu sammeln, ist dies:
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});
});
});
Ich weiß, dass wegen der asychronosity die done()
Methode aufgerufen wird, bevor eine der Versprechungen gelöst werden, aber ich kann jede mögliche Weise nicht finden um das zu verhindern. Ich habe unzählige verschiedene Muster ausprobiert (z. B. https://www.joezimjs.com/javascript/patterns-asynchronous-programming-promises/ oder async.js), aber ich kann es nicht zum Laufen bringen.
Was mache ich falsch? Gibt es eine Lösung ohne zusätzliche Module? Hilfe würde sehr geschätzt werden. Danke im Voraus!
Vielen Dank! Ihre Lösung funktioniert einwandfrei! –