无法通过静态方法访问Mongoose中的Schema变量

时间:2017-07-03 19:08:32

标签: node.js mongodb mongoose enums mongoose-schema

我正在编写一个教程,在Express和Mongoose中构建一个小型库。在本教程中,每本书都可以具有多种状态之一,并且只有其中一种值。它是一个Enum。我通过在BookInstance架构中放置一组值来处理这个问题:

var the_statuses = ['Available', 'Maintenance', 'Loaned', 'Reserved'];

当我有一个实例时工作正常 - 我使用虚方法来获取这些值

BookInstanceSchema
    .virtual('statuses')
    .get(function() {
      return the_statuses;
    });

如上所述,我已经有了一个实例。

在创建Schema时,我访问我的局部变量,以及一个局部变量:

var BookInstanceSchema = Schema({
  book: { type: Schema.ObjectId, ref: 'Book', required: true }, //reference to the associated book
  imprint: {type: String, required: true},
  status: {type: String, required: true, enum: the_statuses, default: 'Maintenance'},
  due_back: {type: Date, default: Date.now},
});

但是,如果我想直接从模式获取枚举值,但是从外部模式中获取该怎么办?也就是说,如果我想创建,在本例中是一个BookInstance实例,并在选择菜单中为用户提供状态选择,那么我还无法访问实例(除非我克服它并简单地创建一个来获取枚举值)。

我尝试制作静态功能

BookInstanceSchema.statics.getStatuses = function() {
    return this.the_statuses;
};

但它似乎不起作用。

做我想做的事情的最佳方法是什么?有没有像静态虚拟方法那样的东西"在猫鼬?

1 个答案:

答案 0 :(得分:1)

自从我使用MongoDB(显然是Mongoose)以来,它已经有点了,但static方法无法访问实例。因此,你真的不应该在静态方法中使用this。此外,BookInstanceSchema的实例似乎没有属性the_statuses(仅虚拟statuses)。从您的代码判断,您似乎可以访问the_statuses定义中的BookInstanceSchema变量。那么,为什么不直接使用呢?

BookInstanceSchema.statics.getStatuses = function() {
    return the_statuses;
};

// Use like
BookInstanceSchema.getStatuses();

编辑:

有关JavaScript中this的更多常规信息,请查看this postMDN docs。简而言之,在" strict"中,它的行为会发生变化。模式,可以通过Function类的方法.call.apply进行操作,以列举一些奇怪的内容。

您应该假设this将引用调用给定方法的对象,因为这是默认行为。在我们的例子中,该对象将是BookInstanceSchema.statics。但是,有一种情况是,Mongoose在statics下调用任何方法在不同的上下文中(我假设在这里),如BookInstanceSchema,但它肯定不会从上下文调用例如,BookInstanceSchema.methods上的方法将被调用的上下文。需要注意的是,这完全是非标准的。 Mongoose基本上模仿OOP概念,如类方法和实例方法(分别为Schema.staticsSchema.methods)。对于Mongoose,我不确定this中的方法中哪个对象Schema.statics引用了它,但它肯定是指Schema.methods上的实例对象。

作为"类"语法变得越来越老(在ES2015中提出)更多的库可能会容纳更多的标准"定义类方法和实例方法的方法(Sequelize正在下一个版本中进行此操作)。此外,类方法和实例方法等OOP概念在JS中是可以实现的,尽管有点不同。如果您有兴趣,this article将会详细介绍Vanilla JS的工作方式,以及与旧函数原型语法形成对比的新类语法的很好的例子。