使用会话设置created_by用户与一个Mongoose插件

即时通讯使用Node.js ,我试图做一个Mongoose插件,将created_by值设置为当前login的用户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插件中获得会话? 或者如何以不同的方式实现这个function,就像轻松一样? 在我看来,这是一个非常常见的用例。

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

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

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

看看.pre('save', ...)是否足以提示这个问题。


我已经使用mongoose中间件自己尝试过了。 即使使用魔术( 拦截和变异方法参数 ),我也无法获得足够简单的解决scheme…我最终将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 

我考虑制作一个快速中间件,删除模式的中间件,并添加一个新的模式中间件,知道请求对象…但这个解决scheme是荒谬的hacky,可能会打破你尝试使用其他mongoose插件。