1

我想實現像plunker這樣的在線編輯器。我已經定義了以下數據結構:一個post(即一個項目)包含folders(表示不同版本的帖子)列表,folder只是一個列表files在添加之前填充:RangeError:超出最大調用堆棧大小

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' } 
}) 

我想用下面的請求(由save按鈕編輯器)添加文件夾/版本。請注意,因爲帖子可以同時在不同的地方打開,所以我們必須從數據庫中取出帖子,然後向其添加版本,然後我們將最新的帖子返回給控制器。

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

這裏是一個嘗試的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 

有誰知道什麼是錯在那裏?

+0

這意味着您遇到無限遞歸,雖然在代碼一眼它不會立即明顯(至少對我來說),之後在那裏...它也有點困難,因爲所有的變量陰影的跟着你正在做。 –

+0

它們是嵌套的回調函數,我不明白遞歸是如何實現的... – SoftTimur

+0

它幾乎必須是最後一次調用'res.json(...'否則你會看到'here'一遍又一遍地在devtools中打印直到你得到了溢出調用堆棧的錯誤...除非它發生在你沒有發佈代碼的地方 –

回答

1

下面的代碼完成我想要的。顯然,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); 
      }) 
     }) 
    }) 
}); 
相關問題