没有递归函数,仍然超出最大调用堆栈大小错误

时间:2014-10-13 17:26:24

标签: javascript node.js express

我尝试使用Node,Express和Mongoose。这是我的模型的一部分 - book-model.js,它导出其模式和方法,以便在控制器中使用。我正在实施胖模型,瘦控制器方法:

// ...

BookSchema.statics.create = function(title, author, category, callback) {
    var Book = mongoose.model('Book');
    Book.create({
        title: title,
        author: author,
        category: category
    }, callback);
};

// ...

module.exports = mongoose.model('Book', BookSchema);

这是控制器的一部分 - books-controller.js

// ...

var Book = require('./book-model');

router.post('/', function(req, res) {
    var title = req.body.title,
        author = req.body.author,
        category = req.body.category;
    Book.create(title, author, category, function(err) {
        if (err) {
            console.log(err);
            res.redirect('/add-book');
        }
        res.redirect('/books');
    });
});

// ...

现在,当我尝试创建新的图书文档时,我收到恼人的超出最大调用堆栈大小消息。我在SO上看了一个类似的问题:Maximum call stack size exceeded error答案是"在代码的某个地方,你正在调用一个函数,而这个函数又会调用另一个函数,依此类推,直到你达到了调用堆栈限制。这几乎总是因为具有基本案例的递归函数未得到满足。"

我无法在books-controller.js文件中看到一个递归函数,该函数有一个基本情况没有得到满足或者我错过了什么?

请告知。

1 个答案:

答案 0 :(得分:2)

这是你的递归:

BookSchema.statics.create = function(title, author, category, callback) {
    var Book = mongoose.model('Book');
    Book.create({
        title: title,
        author: author,
        category: category
    }, callback);
};

基本上,您宣布调用Book.create的{​​{1}}方法。由于javascript没有运算符重载,因此它没有意识到重新定义与仅使用两个参数的旧Book.create冲突。

将函数重命名为Book.create之类的其他内容以打破递归:

make