В настоящее время я работаю над полномочиями авторизации для узла node.js. Я работаю с Sequelize как ORM и Passport в качестве менеджера входа в систему. Чтобы включить функцию авторизации, я хочу добавить массив имен авторизации (только строки) в объект запроса (т. Е. ["manageDelete", "manageAdd", "userManage"]
). Я хочу сделать это в методе passport.deserializeUser()
.Вложенный forEach и асинхронность
Вот некоторая дополнительная информация:
уполномочена хранятся в таблице базы данных MySQL называется authorizations
. Эта таблица связана с другой таблицей roles
в соотношении n to m
(чего я в конечном итоге хочу достичь - это объединить авторизации, чтобы упростить управление авторизациями).
У меня есть большие проблемы с асинхронным кодом, потому что эта тема для меня очень новая. Мой код аккумулировать все разрешения от роли пользователя заключается в следующем:
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 '), но я не могу заставить его работать.
Что я делаю неправильно? Есть ли какое-либо решение без использования каких-либо дополнительных модулей? Помощь будет оценена очень много. Заранее спасибо!
Спасибо большое! Ваше решение работает отлично! –