25

MongoDB と Mongoose ORM を使用して、Node.js/Express で基本的なブログを作成しています。

ブログ/アイデアスラッグを自動生成するために使用したい事前「保存」フックがあります。続行する前に、同じスラッグを持つ他の既存の投稿があるかどうかを確認するためにクエリを実行する部分を除いて、これは正常に機能します。

ただし、this.find または .findOne() にアクセスできないように見えるため、エラーが発生し続けます。

これにアプローチする最良の方法は何ですか?

  IdeaSchema.pre('save', function(next) {
    var idea = this;

    function generate_slug(text) {
      return text.toLowerCase().replace(/[^\w ]+/g,'').replace(/ +/g,'-').trim();
    };

    idea.slug = generate_slug(idea.title);

    // this has no method 'find'
    this.findOne({slug: idea.slug}, function(err, doc) {
      console.log(err);
      console.log(doc);
    });

    //console.log(idea);
    next();
  });
4

2 に答える 2

63

残念ながら、それは十分に文書化されていません ( Document.js API docsconstructorでは言及されていません) が、ドキュメントはフィールドを介してモデルにアクセスできます。それらが接続されているモデル。

module.exports = function readonly(schema, options) {
    schema.pre('save', function(next) {
        console.log(this.constructor.modelName + " is running the pre-save hook.");

        // some other code here ...

        next();
    });
});

あなたの状況では、次のことができるはずです:

IdeaSchema.pre('save', function(next) {
    var idea = this;

    function generate_slug(text) {
        return text.toLowerCase().replace(/[^\w ]+/g,'').replace(/ +/g,'-').trim();
    };

    idea.slug = generate_slug(idea.title);

    // this now works
    this.constructor.findOne({slug: idea.slug}, function(err, doc) {
        console.log(err);
        console.log(doc);
        next(err, doc);
    });

    //console.log(idea);
});
于 2014-10-08T23:44:05.363 に答える
2

thisモデルではなく、ドキュメントを取得しました。ドキュメントにメソッド findOne がありません。

モデルが必要な場合は、ここに示すようにいつでも取得できます。しかし、作成時にモデルを変数に割り当てる方が賢明です。次に、この変数を任意の場所で使用します。別のファイルにある場合は、module.exports を使用して、プロジェクト内の別の場所に取得する必要があります。このようなもの:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
mongoose.connect('mongodb://localhost/dbname', function (err) {
// if we failed to connect, abort
if (err) throw err;
var IdeaSchema = Schema({
    ...
});
var IdeaModel = mongoose.model('Idea', IdeaSchema);
IdeaSchema.pre('save', function(next) {
    var idea = this;

    function generate_slug(text) {
        return text.toLowerCase().replace(/[^\w ]+/g,'').replace(/ +/g,'-').trim();
    };

    idea.slug = generate_slug(idea.title);

    // this has no method 'find'
    IdeaModel.findOne({slug: idea.slug}, function(err, doc) {
        console.log(err);
        console.log(doc);
    });

    //console.log(idea);
    next();
   });
// we connected ok
})
于 2013-10-09T20:34:32.097 に答える