我正在尝试从我的 Java 应用程序内部连接到 firestore 模拟器,但没有成功。
FirebaseOptions options = FirebaseOptions.builder()
.setCredentials(GoogleCredentials.getApplicationDefault())
.setDatabaseUrl("localhost:8082")
.setProjectId("xxx")
.build();
var app = FirebaseApp.initializeApp(options);
Firestore db = FirestoreClient.getFirestore(app);
final ApiFuture<WriteResult> update = db.collection("users").document().set(Map.of("test", "mest"));
try {
final WriteResult writeResult = update.get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
这只是尝试连接到 firebase,忽略数据库 url。
我看了一下node sdk,里面有
emulator
方法和数据库设置,但是Java端不存在
根据文档:
设置 FIRESTORE_EMULATOR_HOST 环境变量后,Firebase Admin SDK 会自动连接到 Cloud Firestore 模拟器:
导出 FIRESTORE_EMULATOR_HOST="localhost:8080"
所以我想你通过什么主机并不重要,只要这个环境存在?
我对数据库链接有类似的问题 你可以试试
.setDatabaseUrl("http://localhost:8082")
对我有用。
后期编辑
使用
.setDatabaseUrl("http://localhost:8082?ns=fake-project-id")
缺少最后一部分会在 websockets 上引发其他错误。
如果您正在使用Firebase Admin SDK(Java),您可以使用以下代码连接到Local Emulator Suite而无需设置FIRESTORE_EMULATOR_HOST环境变量:
import com.google.cloud.firestore.FirestoreOptions;
import com.google.firebase.FirebaseApp;
import com.google.firebase.FirebaseOptions;
import com.google.firebase.internal.EmulatorCredentials;
FirestoreOptions firestoreOptions = FirestoreOptions.newBuilder()
/*
TODO: replace with host at which your emulator is running
*/
.setEmulatorHost("localhost:8080")
.build();
FirebaseOptions firebaseOptions = FirebaseOptions.builder()
.setCredentials(new EmulatorCredentials())
/*
setting valid project-id is IMPORTANT;
otherwise, data will not be visible inside Emulator UI
*/
.setProjectId("[YOUR_FIREBASE_PROJECT_ID]")
.setFirestoreOptions(firestoreOptions)
.build()
FirebaseApp app = FirebaseApp.initializeApp(firebaseOptions)