【发布时间】:2013-06-11 13:39:01
【问题描述】:
这里是一个半菜鸟节点的家伙。在我的翡翠模板中......我真的很想能够拥有这个界面:
if currentUser.isMemberOfGroup(name)
-// dosomething
但是,确定用户的成员资格涉及与 mongoose 的交互……这始终是异步事务。以 mongoose 文档为例,我想按照这些思路写一些东西(对不起,这是用咖啡写的):
userSchema.methods.isMemberOfGroup = (name) ->
Club.findOne(name: name).populate({
path: 'members',
model: 'User',
match: { _id: @id }
}).exec (err, club) ->
club.members.length > 0
有没有办法让这个方法返回一个 bool 而不是从 exec 函数立即返回?设计这样一个界面的“正确”方式是什么?
这是 Club 模型的其余部分:
clubSchema = Mongoose.Schema
name: String
hashTag: String
members: [{ type: Mongoose.Schema.Types.ObjectId, ref: 'User' }]
【问题讨论】:
-
我建议在您的路线中尽可能与其他任务并行获取该信息(flow control libraries 使这非常容易),然后将结果添加到您的本地人。或者,您可以在前端使用 javascript 来异步获取此信息并在完成时更新页面(也就是添加一个专用的异步路由来提供此信息)。实际上,在翡翠渲染过程中编写阻塞代码(同步)与在控制器逻辑中等待此信息相同。
-
另外,如果您只是在寻找成员中包含用户 _id 的俱乐部,您可以使用 mongoose 获取用户所属的所有俱乐部:
Club.find { members : user._id }, 'name', (err, clubs)-> -
泰勒,非常感谢您的反馈。是的,将它设置在路线中似乎是下一个最佳选择......我对设置一堆当地人而不是仅仅通过一个对象感到不那么兴奋。我更喜欢 Rails 范例,在我将变量传递给视图之前,我不必烘烤每个数据点......但我只需要适应。
-
没问题科迪。我完全理解你的观点。为了清理,我有时将路线中的本地人包装在“viewModel”对象(即
res.locals.viewModel = { userMemberOf : clubs, user : user })中,只是为了组织更多。
标签: node.js express mongoose pug