我和Mongoose之间有一个有趣的问题,Mongoose是MongoDB的ODM之一。
我想将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
中的错误还是我错过了什么?答案 0 :(得分:22)
当您致电mongoose.model(...)
时,mongoose
对象将作为model
传递到this
函数。当您通过别名调用该函数时,this
将设置为global
而不是mongoose
。
如果你真的想要这样做,你必须做类似的事情:
var Model = mongoose.model.bind(mongoose);
这样,无论你如何调用mongoose
,Model
都会被传递到函数中。
答案 1 :(得分: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
时,调用上下文是窗口或全局对象。