使用会话使用Mongoose插件设置created_by user

时间:2012-08-07 14:02:49

标签: node.js session express mongoose

我正在使用Node.js并且我正在尝试创建一个Mongoose插件,该插件将created_by值设置为当前登录的用户ID。用户存储在会话中。

lastModifiedPlugin = (schema, options) ->
  schema.add 
    created_by: 
      type: ObjectId
      default: -> 
        session.user._id // Need access to session
    created_at:
      type: Date
      default: Date.now

我正在使用connect-mongo进行MongoDB会话存储。

express = require "express"
MongoStore = require("connect-mongo")(express)

我知道如何在有sessionID的情况下从请求对象获取会话或使用会话存储。问题是:在这种情况下,我没有请求,也没有session,也没有sessionId。

我的问题:你如何在Mongoose插件中获得会话?或者如何以不同的方式实现此功能 - 同样简单?在我看来,这是一个非常常见的用例。

1 个答案:

答案 0 :(得分:3)

你很亲密。正如您所提到的,您的插件定义中没有req和所有附加的会话内容。

稍后可以使用这些值:保存模型时。

因此,您希望模型在保存时自动包含user_id,而不是设置默认值。

查看是否.pre('save', ...) is enough of a hint来解决这个问题。


我自己尝试使用mongoose中间件。即使使用魔术(Intercepting and mutating method arguments),我也无法得到足够简单的解决方案......我最终将req对象传递给.save()(中间件可以提取会话的user_id) )...但.save()的这一添加打破了中间件的魔力。

lastModifiedPlugin = (schema, options) ->
  schema.add 
    created_by: ObjectId
    created_at:
      type: Date
      default: Date.now
  schema.pre 'save', (next, req) -> # No callback required here.
    this.created_by = req?.session?.user_id?
    next()

使用时:

app.get '/', (req, res) ->
  # make an instance of whatever uses the plugin
  instance.save req, (err) -> # Callback required here
    # Callback to handle errors

我考虑制作一个快速中间件,删除架构的中间件并添加一个知道请求对象的新架构中间件......但是这个解决方案非常糟糕,可能会破坏你试图使用的其他mongoose插件