在添加之前填充:RangeError:超出最大调用堆栈大小

我想要实现一个在线编辑器,比如plunker。 我已经定义了以下数据结构:一个post (即一个项目)包含一个folders列表(这意味着不同版本的post),一个folder只是一个files列表。

 var PostSchema = new mongoose.Schema({ folders: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Folder' }] ... }); var FolderSchema = new mongoose.Schema({ files: [{ name: String, body: String, editorOption: Object }], post: { type: mongoose.Schema.Types.ObjectId, ref: 'Post' } }) 

我想使用下面的请求来添加一个文件夹/版本(通过编辑器上的savebutton)。 需要注意的是,由于一个post可以同时在不同的地方打开,所以在添加一个版本之前 ,我们必须从数据库中取出post ,然后把最新的post返回给控制器。

 o.addFolder = function (id, folder) { return $http.post('/posts/' + id + '/editor/folders', folder, { headers: { Authorization: 'Bearer ' + auth.getToken() } }) } router.post('/posts/:post/editor/folders', auth, function (req, res, next) { req.post.populate('folders', function (err, post) { if (err) return next(err); var folder = new Folder(req.body); folder.post = post; folder.save(function (err, folder) { if (err) return next(err); console.log("3 folder: "); console.log(folder); console.log("4 post: "); console.log(post); post.folders.push(folder); console.log("5 folder: "); console.log(folder); console.log("6 post: "); console.log(post); post.save(function (err, post) { if (err) return next(err); res.json({ folder: folder, post: post }) }) }) }) }); 

这里是一个testing日志,它试图将2个文件的文件夹添加到一个空的文章中:

 3 folder: { __v: 0, post: { _id: 58b5e86d8e328f58f3e87ac2, __v: 0, folders: [] }, _id: 58b5e86d8e328f58f3e87ac3, files: [ { name: 'index.html', body: '<!DOCTYPE html>\n<body>\nindex.html\n</body>\n</html>', editorOption: [Object], _id: 58b5e86d8e328f58f3e87ac5 }, { name: 'script.js', body: '', editorOption: [Object], _id: 58b5e86d8e328f58f3e87ac4 } ] } 4 post: { _id: 58b5e86d8e328f58f3e87ac2, __v: 0, folders: [] } 5 folder: events.js:85 throw er; // Unhandled 'error' event ^ RangeError: Maximum call stack size exceeded 

有谁知道那里有什么问题?

以下代码完成我想要的。 显然, req.post.folders.push(folder)可以将folder到最新的 post 。 而且我们最终会populate

 router.post('/posts/:post/editor/folders', auth, function (req, res, next) { var folder = new Folder(req.body); folder.post = req.post; folder.save(function (err, folder) { if (err) return next(err); req.post.folders.push(folder); req.post.save(function (err, post) { if (err) return next(err); req.post.populate('folders', function (err, post) { if (err) return next(err); res.json(post); }) }) }) });