我正在尝试调试为什么从笔记本电脑上的 Node.js 脚本写入本地 Firestore 模拟器在模拟器 GUI 中不可见,以及为什么 Node.js 脚本获取的数据与我在 GUI 中看到的数据不同。换句话说,Node.js 脚本似乎只是在本地访问不同的 Firestore 实例(它可以在关闭 Internet 的情况下工作),可能由模拟器针对不同的项目 ID 进行分区。
模拟器使用firebase emulators:start --only functions,firestore
运行,在
http://127.0.0.1:4000/firestore/default/data/
我看到由模拟函数添加的数据。主页确认了项目 ID,这显然是 Node.js 脚本不使用的。 下面是我的初始化代码:
import { initializeApp } from 'firebase-admin/app';
import { getFirestore } from 'firebase-admin/firestore';
for (const envVar of [
'FIREBASE_CONFIG', // env var listed at https://firebase.google.com/docs/admin/setup#initialize-sdk
'GOOGLE_APPLICATION_CREDENTIALS', // env var listed at https://firebase.google.com/docs/admin/setup#initialize_the_sdk_in_non-google_environments
'GOOGLE_CLOUD_PROJECT', 'GCLOUD_PROJECT' // observed access while debugging with Deno
])
console.log(`${envVar}:`, process.env[envVar]); // all undefined
// Connect to the emulator per https://firebase.google.com/docs/emulator-suite/connect_firestore#admin_sdks or https://cloud.google.com/firestore/docs/emulator#server_client_libraries
process.env['FIRESTORE_EMULATOR_HOST'] = '127.0.0.1:8080';
// Initialize Cloud Firestore per https://firebase.google.com/docs/firestore/quickstart#initialize -> Node.js -> Initialize on your own server
initializeApp();
const db = getFirestore();
就是这样。没有参数传递给 initializeApp()
,我已经使用 Deno 运行脚本来查看它想要什么环境变量。唯一相关的就是上面的(其中有很多,再加上启动
/bin/sh
,但这是一个不同的问题)。它也不会尝试读取
.firebaserc
或
firebase.json
。使用 Firestore 时,Firebase Admin SDK 仅封装
GCP 产品 SDK 使用通用库来查找项目 ID。 您可以在此处查看源代码:https://github.com/googleapis/google-auth-library-nodejs/blob/main/src/auth/googleauth.ts
如果您没有明确提供环境变量或在 GCP 产品中运行,那么它很可能使用gcloud
的输出来查找默认项目 ID。
gcloud config config-helper --format json