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

问题描述 投票:0回答:1

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

var admin = require('firebase-admin');

// Input args
var jsonKey = process.argv[2];
var projectId = process.argv[3];
var newPassword = process.argv[4];

var serviceAccount = require(jsonKey);

admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    databaseURL: "https://" + projectId + ".firebaseio.com"
});

// FIXME Only for debug purposes
var index = 1;

/**
* https://firebase.google.com/docs/auth/admin/manage-users#update_a_user
*/
function nextUser(uid, timeout) { 
    setTimeout(() => {
        admin.auth().updateUser(uid, { 
        password : newPassword
    })
        .then(function() {
            console.log(index++ + ') Successfully updated user', uid);
        })
        .catch(function(error) {
            console.log(index++ + ') Error updating user:', error);
        });
    }, timeout);
}

/**
* https://firebase.google.com/docs/auth/admin/manage-users#list_all_users
* https://stackoverflow.com/a/58028558
*/
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);
            }
        })
        .catch(function (error) {
            console.log('Error listing users:', error);
        });
}

listAllUsers();

该脚本从本地计算机启动,带有

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

如您所见,迭代器正在超时运行,这是在我遇到Exceeded quota for updating account information问题后尝试用this answer解决的问题,这是必需的>

脚本运行正常,所有用户均得到正确处理(我仅为这种调试添加了顺序计数器),并且不会引发“ quota”错误。问题是在脚本末尾,shell提示符没有退出,进程仍然挂起,我需要一个CTRL+C来杀死它。除了此行为的令人讨厌的部分之外,这还阻止了更广泛的脚本,该脚本将调用此脚本,并且不会继续执行下一行命令。

似乎在完成所有setTimeout功能之后,主过程不会自动关闭。

我该如何解决?

我拥有此脚本,该脚本可更改我们用于测试目的的现有FireBase身份验证用户的所有密码,以将用户重置为“干净”状态。 var admin = require('firebase -...

node.js firebase firebase-authentication firebase-admin
1个回答
0
投票

尝试在setTimeout函数中放置以下退出代码。

© www.soinside.com 2019 - 2024. All rights reserved.