gpt4 book ai didi

javascript - 嵌套 forEach 和异步

转载 作者:行者123 更新时间:2023-11-28 05:49:12 24 4
gpt4 key购买 nike

我目前正在为 Node.js 网站开发授权功能。我使用 Sequelize 作为 ORM,使用 Passport 作为登录管理器。为了启用授权功能,我想向请求对象添加一个授权名称数组(只是字符串)(即 ["manageDelete", "manageAdd", "userManage"])。我想在 passport.deserializeUser() 方法中执行此操作。

以下是一些附加信息:

授权存储在名为 authorizations 的 MySQL 数据库表中。该表与另一个名为 roles 的表以 n 到 m 的关系关联(我最终想要实现的是将授权捆绑在一起,以便更轻松地管理授权) .

我在异步代码方面遇到了很大的问题,因为这个主题对我来说非常新。我的累积用户 Angular 色所有权限的代码是这样的:

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});
});
});

我知道由于异步性,在解决任何 promise 之前会调用 done() 方法,但我找不到任何方法来防止这种情况发生。我尝试了无数不同的模式(例如: https://www.joezimjs.com/javascript/patterns-asynchronous-programming-promises/ 或 async.js'),但我无法让它工作。

我做错了什么?有没有不使用任何额外模块的解决方案?非常感谢您的帮助。提前致谢!

最佳答案

Serialize 使用 bluebird Promise,并且 bluebird 有一个 .each 方法可以满足您的需求。我认为这比之前的解决方案简洁得多。附带说明一下,您使用箭头函数的事实表明您正在使用 es6,在这种情况下,我更喜欢 const/let 而不是 var。以下应该可行,但您也许可以使用 bluebird 的 map/reduce 方法想出一个更优雅的解决方案:

passport.deserializeUser(function (id, done) {
let currUser;
const authArr = [];
return models.User.findById(id)
.then((user) => {
currUser = user;
//gets array of associated roles for this user
return User.getRoles();
})
.each((role) => {
//gets array of associated authorizations for this role
return role.getAuthorizations().each((auth) => {
authArr.push(auth.name);
});
})
.then(() => {
done(null, {user: currUser, authArr: authArr});
});
});

关于javascript - 嵌套 forEach 和异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38226161/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com