Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.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 所有setTimeout完成后,节点脚本不会退出_Javascript_Node.js_Firebase_Firebase Authentication_Firebase Admin - Fatal编程技术网

Javascript 所有setTimeout完成后,节点脚本不会退出

Javascript 所有setTimeout完成后,节点脚本不会退出,javascript,node.js,firebase,firebase-authentication,firebase-admin,Javascript,Node.js,Firebase,Firebase Authentication,Firebase Admin,我有这个脚本,它可以更改现有FireBase身份验证用户的所有密码,我们将这些用户用于测试目的,以便将用户重置为“干净”状态 脚本是从本地计算机启动的,具有 node <filename.js> <path of jsonkey> <projectid> <new password> 它很有效,很快。这对我来说已经足够了,因为它是一个测试脚本请尝试在setTimeout函数中输入以下退出代码 process.exit() // exit 我更新

我有这个脚本,它可以更改现有FireBase身份验证用户的所有密码,我们将这些用户用于测试目的,以便将用户重置为“干净”状态

脚本是从本地计算机启动的,具有

node <filename.js> <path of jsonkey> <projectid> <new password>

它很有效,很快。这对我来说已经足够了,因为它是一个测试脚本请尝试在setTimeout函数中输入以下退出代码

process.exit() // exit
我更新了代码

function listAllUsers(nextPageToken) {
    let timeout = 0;
    admin.auth().listUsers(1000, nextPageToken)
        .then(function (listUsersResult) {
            console.log("Retrieved " + listUsersResult.users.length + " users");

            listUsersResult.users.forEach(function (userRecord) {
                timeout = timeout + 100
                nextUser(userRecord.uid, timeout)
            });

            if (listUsersResult.pageToken) {
                listAllUsers(listUsersResult.pageToken);
            }
            process.exit(0); // exit script with success
        })
        .catch(function (error) {
            console.log('Error listing users:', error);
            process.exit(1); // exit script with failure
        });
}
此函数将退出Node.js脚本

process.exit([代码]) 用指定的代码结束进程。如果省略,退出将使用“成功”代码0

要使用“故障”代码退出,请执行以下操作:

过程。退出(1)

执行节点的shell应该将退出代码视为1


官方文件:

我不知道Firebase,但您是否需要某种方法来关闭数据库连接?当您认为代码已经完成时,node.js不会自动退出,这意味着某些网络连接、计时器或其他异步操作仍然处于打开或挂起状态。我所能看到的可能是,在你的应用程序中,可能是一个开放的数据库连接。看看这个。我认为如果你使用异步/等待语法以及标准的“”机制来分隔调用,这对你自己来说会更容易。循环完成后,可以调用admin.app().delete()在上次更新完成后关闭admin SDK。标准循环还可以防止可能出现的内存不足情况同时启动过多的延迟调用。@DougStevenson我按照您的建议尝试了异步/等待,这是当前代码:我尝试了很多次,但找不到完全有效的解决方案。首先,为了尊重睡眠,我必须删除所有内部方法(现在所有代码都在主方法中)。现在的问题是
admin.app().delete()processed@DougStevenson这是一个更“同步”的版本,它不需要睡眠,因为所有的调用都是链接的:当然现在非常慢,因为每次只进行一个调用。但至少它是有效的,当用户完成时,这个过程就正确地结束了。这是行不通的,因为代码在交错延迟上启动了许多setTimeout调用。只有在最后一个脚本完成后,脚本才会终止。是。。但这是一种以编程方式退出脚本的方法。若有任何东西阻塞了process.exit(),那个么我认为它可能还有另一个问题。我刚刚更新了listalUsers()函数。这不是nextUser函数。希望这对您有用)
process.exit()
确实会立即终止进程。不幸的是,此代码仍然无法工作,因为它将在任何用户更新之前退出。所有API都是异步的,并且会立即返回,并带有一个表示完成的承诺。
process.exit() // exit
function listAllUsers(nextPageToken) {
    let timeout = 0;
    admin.auth().listUsers(1000, nextPageToken)
        .then(function (listUsersResult) {
            console.log("Retrieved " + listUsersResult.users.length + " users");

            listUsersResult.users.forEach(function (userRecord) {
                timeout = timeout + 100
                nextUser(userRecord.uid, timeout)
            });

            if (listUsersResult.pageToken) {
                listAllUsers(listUsersResult.pageToken);
            }
            process.exit(0); // exit script with success
        })
        .catch(function (error) {
            console.log('Error listing users:', error);
            process.exit(1); // exit script with failure
        });
}