我正在使用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插件中获得会话?或者如何以不同的方式实现此功能 - 同样简单?在我看来,这是一个非常常见的用例。
答案 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插件