Docker运行Firestore模拟器时遇到的两类技术问题咨询
关于Docker运行Firestore模拟器的两个问题
我通过Docker容器运行Firestore模拟器,目前遇到两个问题,相关代码如下:
Environment.SetEnvironmentVariable("FIRESTORE_EMULATOR_HOST", "localhost:8080"); var builder = new FirestoreDbBuilder { ProjectId = "default", EmulatorDetection = EmulatorDetection.EmulatorOrProduction }; var firestoreDb = builder.Build(); var col = firestoreDb.Collection("Cities"); var docRef = col.Document("YVR"); var result = await docRef.SetAsync(new City { Name = "Vancouver", Population = 675_000 }); var doc = await docRef.GetSnapshotAsync(); doc.Exists.Dump(); var document = firestoreDb.Collection("Cities").Document("YVR"); var snapshot = await document.GetSnapshotAsync(); snapshot.Exists.Dump(); var city = snapshot.ConvertTo<City>(); city.Dump();
City类定义如下:
[FirestoreData] public class City { [FirestoreDocumentId] public string Id { get; set; } [FirestoreProperty] public string Name { get; set; } = null!; [FirestoreProperty] public int Population { get; set; } }
问题1
未指定ProjectId时,会抛出ArgumentNullException异常,提示“Value cannot be null. (Parameter 'projectId')”。已设置FIRESTORE_EMULATOR_HOST环境变量,为何无法自动适配模拟器?使用模拟器时应设置什么ProjectId值?
解答
- Firestore模拟器不要求真实GCP项目ID,但客户端SDK的
FirestoreDbBuilder强制要求传入ProjectId参数,和是否连接模拟器无关。FIRESTORE_EMULATOR_HOST仅负责告诉SDK将请求路由到模拟器,不会自动填充项目ID。 - 模拟器对项目ID没有严格校验,任意字符串都可以使用(比如代码里的
default,或者test-project这类自定义值),只要代码中的项目ID和模拟器UI中选择的项目ID一致即可。
问题2
指定ProjectId后代码可正常运行,但在默认模拟器UI地址http://127.0.0.1:4000/firestore/data中无法看到添加的文档。
解答
- 检查Docker端口映射:Firestore模拟器默认用8080端口,UI用4000端口,确保Docker运行命令包含
-p 8080:8080 -p 4000:4000,将容器端口映射到本地。 - 核对项目ID一致性:打开模拟器UI后,左上角有项目选择下拉框,必须选择和代码中完全相同的项目ID(比如你用的
default)才能查看对应数据。 - 验证请求是否到达模拟器:查看Docker容器日志,确认是否接收到文档写入的请求;也可以在代码中添加日志输出,确认操作执行成功。
- 刷新或重启:若上述都没问题,尝试刷新模拟器UI页面,或者重启模拟器和应用程序,缓存可能导致数据无法实时显示。
内容的提问来源于stack exchange,提问作者Sean Feldman
相关产品推荐
相关产品推荐

