Javascript 递归未通过第一级

Javascript 递归未通过第一级,javascript,recursion,mongoose,Javascript,Recursion,Mongoose,我在JS中遇到递归问题,我不确定为什么我的代码不会终止。我有一个mongoose模式,它遍历一个法院列表,每个法院都有用户(然后我使用另一个模式来搜索签名)。我想返回一个对象,其中包含从输入的级别到最低级别的所有用户。这是我的密码: async function recurCourtUsers(username) { ContactSchema.findOne({'users': {$elemMatch: {userName: username}}}).lean().th

我在JS中遇到递归问题,我不确定为什么我的代码不会终止。我有一个mongoose模式,它遍历一个法院列表,每个法院都有用户(然后我使用另一个模式来搜索签名)。我想返回一个对象,其中包含从输入的级别到最低级别的所有用户。这是我的密码:

    async function recurCourtUsers(username) {
        ContactSchema.findOne({'users': {$elemMatch: {userName: username}}}).lean().then(async function(courts) {
          let level = courts.level;
          let courtName = courts.orgName.substring(0,2);
          let result = await searchModule.findCourt(courtName, level); // returns an object

          if (level === 4) {
            console.log('now at lvl4')
            console.log(result); 

          } else {
            level++
            var temp = await searchModule.findCourt(courtName, level);
            console.log(temp); 
            result.courts.concat(temp.courts);
            result.collections.concat(temp.collections);
            recurCourtUsers(courts.users[0].userName);
          }          
        });
      }
      recurCourtUsers(req.body.username);
我认为searchModule.findCourt()中没有任何错误,因为它只是找到法庭并获取签名,返回一个看起来像

{
  courts: [{courtObjects}] //array of court Objects
  collection: [] //array of users that have signatures
}

// a courtObject looks like this:

{
   _id: objectId,
   orgName: "NY court"
   level: 3 // there are up to 4 levels, 1 being the "highest" or start
   users: [{userName: "15z", displayName: "court2"}]
}
我的问题是,如果我从2级开始,这个函数会一直打印出所有3级球场。我想打印从级别2开始的所有球场(存储在结果变量中),然后打印到级别3,最后打印到级别4。但是这个函数只是停留在下一个级别,并且在一次递归之后似乎永远不会增加级别变量。另外,我是否应该返回任何内容(如结果变量)?我应该改用累加器吗


有什么建议吗?谢谢

我会尝试解释我的理论,让我知道它是否有意义:

在这里,我已经注释掉了不影响递归调用的每一行:

异步函数recurCourtUsers(用户名){ ContactSchema.findOne({'users':{$elemMatch:{userName:userName}}}}).lean().then(异步函数(courts){ let level=法庭级别; //让courtName=courts.orgName.substring(0,2); //let result=await searchModule.findCourt(courtName,level);//返回一个对象 如果(级别==4){ console.log('现在处于lvl4') 控制台日志(结果); }否则{ //水平仪++ //var temp=await searchModule.findCourt(法院名称,级别); //控制台日志(temp); //结果法庭(临时法庭); //结果收集浓度(临时收集); recurCourtUsers(courts.users[0].userName); } }); } recurCourtUsers(请求主体用户名); 为了清楚起见,让我删除它们:

异步函数recurCourtUsers(用户名){ ContactSchema.findOne({'users':{$elemMatch:{userName:userName}}}}).lean().then(异步函数(courts){ let level=法庭级别; 如果(级别==4){ console.log('现在处于lvl4') 控制台日志(结果); }否则{ recurCourtUsers(courts.users[0].userName); } }); } recurCourtUsers(请求主体用户名); 如果你注意到这一点,你似乎是在使用法庭上第一个用户的用户名。这让我想到,当你再次调用这个方法时:
courts.users[0].userName===req.body.userName


这可能就是让你陷入无限循环的原因。

等待重新协商者(courts.users[0].userName);当它返回一个承诺时,只是加上了等待,但它仍然会永远持续下去。它在下一个关卡打印出正确的球场,然后继续这样做。不确定,但你能试着改变var temp让temp