代码之家  ›  专栏  ›  技术社区  ›  Jayesh Dhandha

节点JS应用程序在解析()时卡住

  •  0
  • Jayesh Dhandha  · 技术社区  · 6 年前

    在列出aws cognito用户时,我在node js应用程序中遇到了一个问题。

    只有当我有60多个认知用户时,这个问题才会出现。

    Reference of API

    下面是我的代码片段。

    function isAllowedToDeleteOrRevokeUsers(cognitoidentityserviceprovider, params, listUsers, adminUserList) {
    return new Promise(function(resolve, reject) {
      cognitoidentityserviceprovider.listUsers(params, function(err, data) {
           if (err) {
               logger.log("ERROR", "Error while calling listUsers API : " + err);
               reject({ code: 404, msg : err.message});
           } else {
               data.Users.forEach(function(user) {
                   if (isUserASystemAdmin(user)) {
                       adminUserList.users.push(user);
                   }
               });
               if (data.PaginationToken != undefined) {
                    params.PaginationToken = data.PaginationToken;
                    isAllowedToDeleteOrRevokeUsers(cognitoidentityserviceprovider, params, listUsers, adminUserList);
               } else {
                    // We've reached the end
                    let totalCognitoAdminUsers = 0;
                    let totalCognitoAdminUsersToDelete = 0;  
    
                    adminUserList.users.forEach(function(adminUser) {
                        if (isCognitoUser(adminUser)) {
                            totalCognitoAdminUsers++;
                            if (listUsers.indexOf(adminUser.Username) > -1) {
                               totalCognitoAdminUsersToDelete++;
                            }
                        }
                    });
    
                   if(totalCognitoAdminUsers != 0 && (totalCognitoAdminUsers == totalCognitoAdminUsersToDelete)) {
                       reject({ code: 404, msg : "Cannot alter last Admin User controlled by standard authentication"});
                   } else {
                       console.log("Return Success");
                       resolve();
                   }
               }
           }
        });
      });
    };
    

    当我少于60个用户时,此功能工作正常,但根据 AWS Docs 我们一次只能读取60个用户,在这种情况下,我正在发送 分页标记 在参数中。

    我的密码被卡住了 resolve() 线。

    如果我删除下面的代码,它就会工作。

     if (data.PaginationToken != undefined) {
        params.PaginationToken = data.PaginationToken;                    
        isAllowedToDeleteOrRevokeUsers(cognitoidentityserviceprovider, params, listUsers, adminUserList);
     } 
    

    有什么帮助吗?

    如果还需要什么,请告诉我。

    2 回复  |  直到 6 年前
        1
  •  2
  •   feeela    6 年前

    在上述情况下 if 语句为true时,将执行函数的递归: isAllowedToDeleteOrRevokeUsers(…) .

    您不应该在promise中进行递归调用,而应该解析每个页面的promise,并为分页的每个新页面重新执行它。

    换句话说:确保承诺中的逻辑中的每一条路径都会导致 resolve() reject() 打电话。如果您的应用程序逻辑需要递归,请重新构造该函数,在每个递归上都会创建并解决一个新的承诺。

        2
  •  0
  •   Dilip Kola    6 年前

    你能试试下面的代码吗?

    function isAllowedToDeleteOrRevokeUsers(cognitoidentityserviceprovider, params, listUsers, adminUserList) {
        return cognitoidentityserviceprovider.listUsers(params).promise().then((data) => {
            data.Users.forEach(function(user) {
                if (isUserASystemAdmin(user)) {
                    adminUserList.users.push(user);
                }
            });
            if (data.PaginationToken != undefined) {
                params.PaginationToken = data.PaginationToken;
                return isAllowedToDeleteOrRevokeUsers(cognitoidentityserviceprovider, params, listUsers, adminUserList);
           } else {
                // We've reached the end
                let totalCognitoAdminUsers = 0;
                let totalCognitoAdminUsersToDelete = 0;  
    
                adminUserList.users.forEach(function(adminUser) {
                    if (isCognitoUser(adminUser)) {
                        totalCognitoAdminUsers++;
                        if (listUsers.indexOf(adminUser.Username) > -1) {
                           totalCognitoAdminUsersToDelete++;
                        }
                    }
                });
                if(totalCognitoAdminUsers != 0 && (totalCognitoAdminUsers == totalCognitoAdminUsersToDelete)) {
                    throw new Error({ code: 404, msg : "Cannot alter last Admin User controlled by standard authentication"});
                }
                console.log("Return success");
                return;
           }
        }).catch((err) => {
            logger.log("ERROR", "Error while calling listUsers API : " + err);
            throw new Error({ code: 404, msg : err.message});
        })
    }
    

    我对原始代码做了一些细微的改进,原始代码做出了许多承诺,这些承诺将被卡在挂起状态,因为在最终递归结束条件时,预期永远不会得到解决。我使用隐式的承诺链,通过在承诺块中返回承诺,这使得所有的承诺链在一起。一旦代码到达递归结束,那么链中的每个承诺都将得到解决。这个实现使用的是纯粹的承诺,所以很容易理解。