2

私は使用していて、created_by値を現在ログインしているユーザーIDに設定するプラグインをNode.js作成しようとしています。Mongooseユーザーはセッションに保存されます。

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がある場合にセッションストアを使用する方法を知っています。問題は次のとおりです。この場合、リクエストもセッションもセッションIDもありません。

私の質問: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 に答える