javascript - Mongoose 模型静态方法的TypeError

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

然后在一个单独的 Controller 中,我做

Controller /另一个.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] }
...

知道我做错了什么吗?

最佳答案

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

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

关于javascript - Mongoose 模型静态方法的TypeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16663072/

相关文章:

javascript - NodeJS Javascript for 循环更改内容

mongodb - 蒙戈 : Using $dayOfWeek in a $match clause when query has also a $groupy

javascript - 纯javascript中的延迟分配

c# - 无法成功从数据库中删除记录

jquery - XPage 的服务器端 Javascript 库(jQuery、Underscore、Dojo)

node.js - Seqeulize PostgreSQL ORM (Node.js) 中的 CHECK 约束

javascript - 为什么在使用 'new' 创建对象并立即返回时作为对象属性不访问闭包?

javascript - 防止在多个下拉菜单中重复选择

javascript - MongoDB中如何存储XML格式的数据?

node.js - 如何使用 MongoDB 和 Mongoose for Node.js 存储线程评论?