我正在使用node.js和MongoDb驱动程序Mongoose 3.6.1。这是我的架构定义:
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var userSchema = new Schema({
...
});
module.exports = {
model : mongoose.model('User', userSchema)
};
userSchema.statics.doSomething = function () {
console.log("I'm doing something");
}
然后在一个单独的控制器中,我做
var User = require("../models/user").model;
function foo() {
User.doSomething();
}
我收到以下错误
[TypeError: Object function model(doc, fields, skipId) {
if (!(this instanceof model))
return new model(doc, fields, skipId);
Model.call(this, doc, fields, skipId);
} has no method 'doSomething']
但是,如果我转储User
对象,我可以按预期看到那里的方法。这是转储确认的相关部分
...
schema:
{ statics:
{ doSomething: [Function] }
...
对我做错了什么的想法?
答案 0 :(得分:14)
您需要在创建模型之前设置静态方法:
userSchema.statics.doSomething = function () {
var User = mongoose.model('User');
// I think 'this' also points to the User model here:
// var User = this;
// var user = new User(...);
console.log("I'm doing something");
}
module.exports = {
model : mongoose.model('User', userSchema)
};
模型是,使用Mongoose术语,从模式“编译”。创建模型后,对模式的任何更改都不会传播到从中派生的模型。