使用会话设置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插件。