You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 16:15:03