【问题标题】:TypeError on static method of mongoose model猫鼬模型的静态方法上的TypeError
【发布时间】:2013-05-21 14:44:52
【问题描述】:

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

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

知道我做错了什么吗?

【问题讨论】:

  • new Schema({ = new mongoose.Schema({ ?
  • 是的。我忘了把它包括在 sn-p

标签: javascript node.js mongodb mongoose


【解决方案1】:

您需要在创建模型之前设置静态方法

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

【讨论】:

  • 谢谢!我是猫鼬的新手,我完全错过了。但是,如果我需要引用其中一个静态模型中的模型怎么办?例如,假设使用一种静态方法来创建User 实例。或者如果我需要从一个静态引用到另一个静态怎么办?
  • 您可以使用mongoose.model('User')在静态方法中检索模型类。
  • 好的,所以如果我的理解是正确的,我不能在我的静态声明之上为模型声明一个便利变量并使用它,因为这会将模型“冻结”到不完整的模式。我将永远不得不在我的静态中使用model('User')。对吗?
  • 查看我的编辑。我进行了快速测试,您的静态变量中的 this 也指向模型类,因此您可以使用 var user = new this({...}) 在您的静态方法中创建一个新实例。
  • 它有效,非常感谢!我接受你的回答,即使我仍然有可能相关的问题。为什么var User = require("./user.js").model; 放在另一个模型中应该返回undefined?我即将提出另一个问题,但也许你有一个快速的答案
猜你喜欢
  • 2017-05-05
  • 2016-08-28
  • 2014-07-15
  • 2020-09-11
  • 2018-04-27
  • 2017-02-04
  • 2015-05-03
  • 2018-10-28
相关资源
最近更新 更多