Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 添加前填充:RangeError:超过最大调用堆栈大小_Javascript_Node.js_Mongoose_Mongoose Schema_Mongoose Populate - Fatal编程技术网

Javascript 添加前填充:RangeError:超过最大调用堆栈大小

Javascript 添加前填充:RangeError:超过最大调用堆栈大小,javascript,node.js,mongoose,mongoose-schema,mongoose-populate,Javascript,Node.js,Mongoose,Mongoose Schema,Mongoose Populate,我想成为像普朗克这样的在线编辑。我已经定义了以下数据结构:post(即,一个项目)包含一个文件夹的列表(这意味着post的不同版本),而文件夹只是一个文件的列表 var PostSchema = new mongoose.Schema({ folders: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Folder' }] ... }); var FolderSchema = new mongoose.Schema({ files

我想成为像普朗克这样的在线编辑。我已经定义了以下数据结构:
post
(即,一个项目)包含一个
文件夹的列表(这意味着post的不同版本),而
文件夹
只是一个
文件的列表

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
3文件夹:
{uuv:0,
职位:
{u id:58b5e86d8e328f58f3e87ac2,
__v:0,
文件夹:[]},
_id:58b5e86d8e328f58f3e87ac3,
文件夹:
[{name:'index.html',
正文:'\n\nindex.html\n\n',
编辑选项:[对象],
_id:58b5e86d8e328f58f3e87ac5},
{name:'script.js',
正文:“”,
编辑选项:[对象],
_id:58b5e86d8e328f58f3e87ac4}]}
4个员额:
{u id:58b5e86d8e328f58f3e87ac2,
__v:0,
文件夹:[]}
5文件夹:
events.js:85
投掷者;//未处理的“错误”事件
^
RangeError:超出了最大调用堆栈大小

有人知道那里出了什么问题吗?

下面的代码实现了我想要的。显然,
req.post.folders.push(folder)
可以将
文件夹
推送到最新的
post
。最后我们会填充

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

这意味着您正在经历无限递归,尽管在浏览代码之后,它并不是很明显(至少对我来说)在哪里。。。这也有点难理解,因为你正在做的所有变量隐藏。它们是嵌套回调,我不知道递归是怎么可能的…它几乎必须是最后一个调用
res.json(…
否则,您将在devtools中看到“here”反复打印,直到您得到溢出调用堆栈的错误…除非它发生在您未发布的代码中的某个地方。我的测试显示它无法在
post.folders.push(folder)之后显示日志
Hey SoftTimur我发现一些帖子有类似的问题。“未处理的错误事件”为我指出了如何处理未解决的回调。编写return next()而不是return next(err)是否有助于错误处理?