是否有可能在运行时动态地向模型添加方法?

mongoose - Is it possible to dynamically add methods to model at runtime?

本文关键字:模型 添加 方法 有可能 运行时 动态 是否      更新时间:2023-09-26

我知道你可以在模式上定义方法和静态

var schema = new mongoose.Schema({});
schema.methods.fn = function(){}

但是,在您从模式中创建了模型之后,这可能吗?

var model = mongoose.model(schema);

我试着

model.schema.methods.fn2 = function(){};

但它不起作用。

我想在运行时添加某些方法,并且由于运行时唯一重要的事情是模型,而不是模式,我想知道您是否可以继续以某种方式动态地向模型的内部模式添加方法?

是的,你可以像添加其他javascript类一样添加方法到你的猫鼬模型。

var Person = mongoose.model('Person', PersonSchema);
Person.prototype.myMethod = function() {
    console.log(this.toString());
}
var bob = new Person({
    name: 'Bob'
});
myModel.myMethod();

请注意,像这样将javascript类大写是一个很好的惯例,它使读者清楚地知道它是一个应该使用new调用的构造函数。

您可以通过在模型对象上创建原型来在任何注册模型上创建原型。

模型定义文件

//define your schema
module.exports = mongoose.model('model', schema);

使用mongoose对象来访问您选择的模型并添加一个方法。如果愿意,可以将模型名和函数名设置为变量:

if (!mongoose.models['model']['fn2']) {
    mongoose.models['model'].prototype['fn2'] = function() {
        console.log("Yeah!");
    }
}

一旦这个函数被原型化,只需在这个模型中的任何文档上调用实例函数:

model.findById(someId).exec(function(err, doc) {
    if (doc) {
        if (typeof doc.fn2 === 'function') {
            doc.fn2(); //writes "Yeah!" to the console.
        }
    }
});