在自定义静态创建中包装Model.create

时间:2014-01-27 20:54:17

标签: javascript node.js mongoose

我想将Mongoose Model.create方法包装在我自己的static创建方法中:

// File: Task.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var taskSchema = mongoose.Schema({
    name: String
});

// Custom static create method
taskSchema.statics.create = function (task) {
    console.log('CREATING TASK');
    return this.model('Task').create(task); // should call Mongoose `create`, not my custom static.
};

module.exports = mongoose.model('Task', taskSchema);

用法如下:

// Usage:
var Task = require('Task.js');
var promise = Task.create(taskObject); // call custom static `create`.

但这并不奏效。在返回CREATING TASK之前,它会多次记录RangeError: Maximum call stack size exceeded

我怀疑this.model('Task').create(task)调用我的自定义静态create方法而不是mongoose create方法,从而导致无限循环。例如,如果我将自定义方法重命名为myCreate,则一切都按预期工作。

我如何仍然使用create方法,但在其中调用mongoose create

1 个答案:

答案 0 :(得分:1)

您应该能够使用Function.prototype.call()使用您需要的模型调用Model.create()函数:

taskSchema.statics.create = function (task) {
    console.log('CREATING TASK');
    return mongoose.Model.create.call(this.model('Task'), task);
};

因此,这将调用mongoose.Model.create(task)并将函数调用的“this”设置为this.model('Task')