2

我正在使用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-mongoMongoDB 会话存储。

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

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

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

4

1 回答 1

3

你很近。正如您所提到的,您req的插件定义中没有可用的所有附加会话好东西。

但是,这些值稍后可用:当您保存模型时。

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

看看是否.pre('save', ...)有足够的提示 来解决这个问题。


我自己尝试过使用猫鼬中间件。即使使用魔术(拦截和变异方法参数),我也无法得到一个足够简单的解决方案......我最终将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

我考虑制作一个快速中间件,删除模式的中间件并添加一个新的模式中间件,该中间件知道请求对象......但该解决方案非常荒谬,可能会破坏您尝试使用的其他猫鼬插件。

于 2012-08-07T15:25:52.673 回答