3

MongoDB の ODM の 1 つである Mongoose に面白い問題があります。

mongoose.modelメソッドを単純にエイリアスしたかったのですModel。エイリアスもチェックしました:

exports = Model = mongoose.model;
console.log(Model === mongoose.model); // returns true

私はすでにこれを行ってmongoose.Schemaおり、シームレスに機能しました。

エイリアスされたModel変数を使用してスキーマを登録すると、次のようになります。

Model('User', UserSchema);

次のエラーが表示されます。

/node_modules/mongoose/lib/index.js:257
  if (!this.modelSchemas[name]) {
                        ^
TypeError: Cannot read property 'User' of undefined
    at Mongoose.model (/node_modules/mongoose/lib/index.js:257:25)
    at Object.<anonymous> (/app/models/user.js:20:1)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
    at controllers_path (/app.js:23:2)
    at Array.forEach (native)

しかし、通常の形式を使用すると、エラーはまったく発生しません。

mongoose.model('User', UserSchema);
  • これは のバグですか、Mongoose.js ODMそれとも何か不足していますか?
4

2 に答える 2

22

を呼び出すmongoose.model(...)と、オブジェクトはとして関数mongooseに渡されます。エイリアスを介して関数を呼び出すと、 の代わりにが設定されます。modelthisthisglobalmongoose

本当にこれをやりたい場合は、次のようにする必要があります。

var Model = mongoose.model.bind(mongoose);

そうmongooseすれば、どのように呼び出しても関数に渡されますModel

于 2013-07-31T02:18:47.643 に答える
2

@JohnnyHKの回答について詳しく説明します。

var a = {
    b:function(){
        console.log(this.name)
    },
    name:"its a"
}
a.b() //logs "its a"
var c = a.b;
c(); //logs undefined

c呼び出しコンテキストを呼び出している間は、ウィンドウまたはグローバル オブジェクトです。

于 2013-07-31T05:29:38.533 に答える