Windows环境下Firebase模拟器无法正常关闭导致--export-on-exit无法保存数据
根因说明
Windows平台的firebase-tools-instant-win.exe存在终端信号捕获兼容缺陷,按下Ctrl+C时不会向模拟器进程发送SIGINT终止信号,而是被终端识别为普通输入字符,因此模拟器不会执行正常退出流程,自然不会触发--export-on-exit参数对应的本地数据导出逻辑。未正常关闭的模拟器进程会残留后台占用端口,新启动的模拟器检测到端口被占用就会自动递增端口号,同时触发多实例运行的提示。
解决方案
优先方案:替换为标准Node.js版firebase-tools
- 卸载当前的
firebase-tools-instant-win.exe,可通过Windows控制面板的程序卸载功能,或直接删除其安装目录完成卸载 - 安装LTS版本的Node.js,安装完成后在终端执行
npm install -g firebase-tools完成官方标准工具的全局安装 - 后续启动模拟器使用完整命令
firebase emulators:start --export-on-exit=./saved-data,此时按下Ctrl+C即可触发模拟器正常退出流程,自动导出数据到指定目录,残留进程会被自动清理,端口也不会再自动递增
临时方案:继续使用instant版本的处理方法
- 不要用Ctrl+C终止模拟器,打开模拟器web控制台(默认地址为localhost:4000),点击右上角的停止模拟器按钮,即可触发正常退出逻辑完成数据保存
- 若已出现多实例残留、端口错乱问题,打开Windows任务管理器,找到所有名称带
firebase、java的进程,手动结束任务后再重启模拟器即可 - 每次启动模拟器前可执行
firebase emulators:stop命令,自动清理所有残留的模拟器进程
附加配置:固定端口防止自动递增
编辑项目根目录下的firebase.json文件,在emulators配置段手动指定所有服务的固定端口,参考配置如下:
{ "emulators": { "auth": { "port": 9099 }, "firestore": { "port": 8080 }, "realtimeDatabase": { "port": 9000 }, "ui": { "port": 4000, "enabled": true } } }
配置完成后如果存在残留进程,模拟器启动时会直接报端口占用错误,不会自动递增端口,方便及时清理残留进程。
内容的提问来源于stack exchange,提问作者NinFudj
相关产品推荐
相关产品推荐

