4

我正在使用 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");
}

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

控制器/另一个.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] }
...

知道我做错了什么吗?

4

1 回答 1

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 术语来说,模型是从模式“编译”而来的。创建模型后,对架构的任何更改都不会传播到从它派生的模型。

于 2013-05-21T06:34:17.567 回答