【问题标题】:How do I write predicate instance methods with mongoose?如何使用 mongoose 编写谓词实例方法?
【发布时间】: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


【解决方案1】:

Jade 是否支持异步函数(似乎不支持https://github.com/visionmedia/jade/issues/641)?如果没有,您必须在渲染模板之前加载该值。

这实际上通常是一种很好的做法,因为它允许分离关注点(视图不应该知道数据库)。顺便说一句,如果你需要做很多异步条件逻辑,请查看https://github.com/olalonde/boolasync(我写的一个模块)。此外,如果您需要执行多个数据库调用,我强烈建议您使用 async.series 或 async.parallel 以使您的代码更具可读性(嵌套深度不要超过几层)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多