2017-06-16 11 views
0

私は、ポストミドルからドキュメントIDを取得する必要がありますが、findAndUpdateを実行するときには存在しないことがあります。ミドルウェアのプレ/セーブ用マングースモデルメソッドを使用する際にドキュメントIDを取得する

誰でも知っていますか?

const mongoose = require('mongoose'), 
     Schema = mongoose.Schema, 
     ShiftSchema = new Schema({ 
     _id: { type: String, 'default': shortid.generate}, 
     creator_id: { type: String, required: true }, 
     project_id: { type: String, required: true } 
     }), 
     _ = require('underscore'); 

var when_to_notify = ['save', 'findByIdAndUpdate', 'findOneAndUpdate', 'findByIdAndUpdate']; 

_.each(when_to_notify, function(pre_func) { 
    ShiftSchema.post(pre_func, function() { 
    otherFunc(this); 
    }); 
}) 

function otherFunc(self) { 
    doSomethingWith(self._id) 
    // typeof self._id == 'undefined' == true 
} 

答えて

1

ミドルウェアのドキュメントおよびクエリ関数では、特定の機能セットのみがサポートされています。

ドキュメントミドルウェアはサポートしています。

  • のinit
  • 検証
  • 保存

クエリミドルウェアは、これらのモデルとクエリ機能をサポートして削除します。

  • findOneAndUpdate
  • findOne
  • findOneAndRemove
  • を見つけるinsertMany
  • もう一つの要因があることかもしれ更新

クエリメートルiddywareは微妙な文書ミドルウェアとは異なりますが、重要な意味は です。これは、文書ミドルウェアでは、文書 が更新されていることを示しています。クエリミドルウェアでは、mongooseは必ずしも のドキュメントへの参照を更新する必要はないので、更新されるドキュメントではなくクエリ オブジェクトを参照します。

例では、クエリとドキュメントのミドルウェアを同じ関数でミックスしているため、コンテキストが異なります。ドキュメントミドルウェアの署名は、実際にはドキュメントの引数をとります:

schema.post('save', function(doc) { 
    console.log('%s has been saved', doc._id); 
}); 
関連する問題