Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript mongoose-是否可以在运行时向模型动态添加方法?_Javascript_Node.js_Mongoose - Fatal编程技术网

Javascript mongoose-是否可以在运行时向模型动态添加方法?

Javascript mongoose-是否可以在运行时向模型动态添加方法?,javascript,node.js,mongoose,Javascript,Node.js,Mongoose,我知道您可以在模式上定义方法和静态 var schema = new mongoose.Schema({}); schema.methods.fn = function(){} 但是,在您从模式创建了模型之后,有可能吗 var model = mongoose.model(schema); 我试过了 model.schema.methods.fn2 = function(){}; 但它不起作用 我想在运行时添加某些方法,因为运行时唯一重要的是模型,而不是模式,我想知道您是否可以继续以某种方

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

var schema = new mongoose.Schema({});
schema.methods.fn = function(){}
但是,在您从模式创建了模型之后,有可能吗

var model = mongoose.model(schema);
我试过了

model.schema.methods.fn2 = function(){};
但它不起作用


我想在运行时添加某些方法,因为运行时唯一重要的是模型,而不是模式,我想知道您是否可以继续以某种方式动态地将方法添加到模型的内部模式?

是的,您可以像添加任何其他javascript类一样将方法添加到mongoose模型

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.
        }
    }
});   

中间件也可以这样做吗?