3

我对 Mongoose 有一个有趣的问题,Mongoose 是 MongoDB 的 ODM 之一。

我想将mongoose.model方法​​别名为 simple 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对象将model作为 传递给函数this。当您通过别名调用该函数时,this将设置为global而不是mongoose.

如果您真的想这样做,则必须执行以下操作:

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 回答