我尝试使用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
文件中看到一个递归函数,该函数有一个基本情况没有得到满足或者我错过了什么?
请告知。
答案 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