对于猫鼬模型的静态方法的TypeError

时间:2013-05-21 05:56:00

标签: javascript node.js mongodb mongoose

我正在使用node.js和MongoDb驱动程序Mongoose 3.6.1。这是我的架构定义:

模型/ user.js的

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");
}

然后在一个单独的控制器中,我做

控制器/ another.js

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] }
...

对我做错了什么的想法?

1 个答案:

答案 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术语,从模式“编译”。创建模型后,对模式的任何更改都不会传播到从中派生的模型。