Firebase数据填充脚本Promise.all执行完成后终端挂起,是什么原因?
问题原因
脚本终端挂起的根本原因是Firebase Web SDK初始化后会维持与服务端的长连接用于实时功能,Node.js进程检测到存在活跃的网络连接句柄,因此不会自动终止,你的业务逻辑本身没有问题,所有数据都已正常写入。
修复方案
- 修正
seedUsers函数的返回逻辑
你当前的seedUsers函数最后仅执行了Promise.resolve(user_store),没有显式返回值,async函数默认返回undefined,需改为直接返回结果:
const seedUsers = async (users) => { // seeds firebase Auth const user_auth_hydrated = await Promise.all(users.map(user => { return createUserInAuth(user) })) // seeds firebase Firestore // we wait for auth because we want to retain the uids to create matching records in store const user_store = await Promise.all(user_auth_hydrated.map(user => { return createUserInStore(user) })) // 修正此处:显式返回结果 return user_store }
- 引入Firebase实例销毁方法,操作完成后主动释放资源并退出进程
首先导入deleteApp方法:
const { deleteApp } = require('firebase/app');
修改seedUsers的调用逻辑,所有操作完成后销毁Firebase实例、主动退出进程:
seedUsers(data) .then(() => console.log("所有用户数据填充完成")) .catch(err => console.error("数据填充出错", err)) .finally(async () => { // 销毁Firebase实例,释放所有网络连接 await deleteApp(auth.app); // 主动终止进程,0代表正常退出 process.exit(0); })
- 可选简化方案
如果不需要等待资源释放的逻辑,也可以在确认所有操作完成后直接调用process.exit(0)退出进程,无需销毁Firebase实例,仅适合本地数据填充这类一次性脚本场景。
内容的提问来源于stack exchange,提问作者Fernando Rafael Narbona
相关产品推荐
相关产品推荐

