在node.js(node-orm)中链接模型关系,就像在Rails中一样

我正在构build一个相对较大的NodeJS应用程序,目前我正试图弄清楚如何从数据库中获取我需要的数据。 这是我的模型的一部分:

一个用户有一个angular色,它可以访问许多模块(其中有一个表role_modules来链接angular色和模块)。

在Rails中,我会做一些像user.role.modules来检索他有权访问的模块列表。 在NodeJS中有点复杂。 我使用node-orm2和PostgreSQL。 这是我到目前为止:

req.models.user.find({email: req.body.user}, function(err, user) { user[0].getRole(function(err, role) { role.getModules(function(err, modules) { var list_modules = Array(); modules.forEach(function(item) { console.log(item); list_modules.push(item.name); }) 

但我不能这样做,因为item只包含role_id和module_id。 如果我想要这个名字,我将不得不做item.getModule(function() {...}) ,但结果将是asynchronous的…所以我真的不知道我怎么可以结束包含用户有权访问的模块名称的数组…有什么想法?

另外,是不是比实际运行多个JOIN的单个SQL查询慢? 因为就我所见,ORM使得多个查询来获得我想要的数据…

谢谢!

我写了一个名为bookshelf.js的ORM,旨在简化SQL中模型之间的关联和加载关系。 这就是你的查询可能看起来像加载angular色和模块的用户给你的描述:

 var Module = Bookshelf.Model.extend({ tableName: 'modules' }); var Role = Bookshelf.Model.extend({ tableName: 'roles', modules: function() { return this.belongsToMany(Module); } }); var User = Bookshelf.Model.extend({ tableName: 'users' role: function() { return this.hasOne(Role); } }); User.forge({email: req.body.user}) .fetch({ require: true, withRelated: ['role.modules'] }) .then(function(user) { // user, now has the role and associated modules eager loaded console.log(user.related('role')); console.log(user.related('role').related('modules')) }, function(err) { // gets here if no user was found. }); 

可能值得一看。