【问题标题】:Setting created_by user with a Mongoose plugin using session使用会话使用 Mongoose 插件设置 created_by 用户
【发布时间】:2012-08-04 13:42:14
【问题描述】:

我正在使用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 时使用会话存储。问题是:在这种情况下,我没有请求,也没有会话,也没有 sessionId。

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

【问题讨论】:

标签: node.js session express mongoose


【解决方案1】:

你已经接近了。正如您所提到的,您的插件定义中没有 req 和所有可用的附加会话。

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

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

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


我自己使用猫鼬中间件进行了尝试。即使使用魔术技巧(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

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

【讨论】:

  • 感谢您的回答。我已经在 updated_by 字段中使用了 .pre('save',...) 钩子,当然这也给出了同样的问题。我不知道您可以像使用req 那样传递额外的参数。至少那是什么。但就像你说的,“它打破了魔法”。
  • 我在这里找到了相同的答案:stackoverflow.com/questions/10485302/… 这表明您需要在next() 中使用callback。如果您将此添加到您的答案中,我会接受它作为正确的分析器。
  • 嘿 Michiel,如果您打算将其制作为并行中间件,您只需要传入回调,因为我们在此示例中的操作是同步的,您不需要它。 (请参阅 mongoosejs.com 主文档页面上的中间件文档,在“拦截和变异...”上方)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-01
  • 1970-01-01
  • 2018-07-31
  • 1970-01-01
  • 2018-05-11
  • 2013-01-27
相关资源
最近更新 更多