javascript - 如何避免/防止 Node.js 中的无限递归调用?

标签 javascript node.js mongodb recursion

我的 Node.js 应用程序中有一个 javascript 函数,它调用自身来查找其在 MongoDB 的父子层次结构中的级别。文档将尝试找到其父文档,如果找到,则会提高级别并继续下去,直到找不到父文档。看起来像下面这样,

function findLevel(doc, level, callback){
    if(!doc)
        return callback(null, level);
    var query = {
        id: doc.parentID
    };
    model.findOne(query, function(err, parentDoc){
        if(err){
            return callback(err, level)
        };
        return findLevel(parentDoc, level+1, callback);
    })
}

这很有可能产生无限递归调用。其中一种情况是parentID 与当前文档的id 相同。可以通过在查找查询中包含另一个条件来避免这种情况,但我仍然担心我可能会错过一些东西,并且它可能会导致整个应用程序崩溃/终止。 Node.js 中是否有推荐的方法来避免/防止这种情况?或者我们可以限制递归调用的级别并优雅地停止它,就像说递归调用应该只进行到这个 n 级别?

最佳答案

您可以通过记下递归期间遇到的所有 ID 并在之前处理过 ID 后立即停止来实现循环检测。

function findLevel(doc, callback) {
    var level = 0, seen = {};

    (function getParent(doc) {
        // proper termination
        if(!doc || !doc.parentID) return callback(null, level);

        // cycle detection
        if (seen.hasOwnProperty(doc.parentID)) return callback(new Error("cycle detected"));
        seen[doc.parentID] = true;

        // recursion
        model.findOne({id: doc.parentID}, function (err, parentDoc) {
            if (err) return callback(err);

            level++;
            getParent(parentDoc);
        });
    })(doc);
}

关于javascript - 如何避免/防止 Node.js 中的无限递归调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42409744/

相关文章:

javascript - 使用 React Router 隐藏组件

Node.js puppeteer - 下载并打开 .idx 文件

ruby-on-rails - Mongoid accepts_nested_attributes_for 问题

node.js - 通过nodejs访问.mdb文件

javascript - 400 错误请求 : Node. js Express Ajax

javascript - Mongoose 中未处理的PromiseRejection警告

MongoDB聚合组结果按公共(public)字段查询

javascript - 处理两个单独的 JQuery Api 调用

javascript - 从 bootstrap 弹出窗口打开隐藏的 div

javascript - TypeScript Intellisense 和 jQuery 问题