如何写到Firestore模拟器?

时间:2019-09-04 14:51:13

标签: firebase google-cloud-firestore google-cloud-functions firebase-cli

我正在开发可写入Firestore数据库的Firebase云功能。

在开发过程中,我希望函数将其写入本地数据库。因此,我启动了一个Firestore模拟器。但是数据仍然写到实际的数据库中。

如何配置云功能以使用本地数据库?

这是我的设置:

import * as functions from 'firebase-functions';
import * as cors from "cors";
import * as admin from "firebase-admin";

const REGION = "europe-west1";
const COLLECTION_CONTACT_FORM = "contact_form";

const serviceAccount = require("../keys/auth-key.json");
admin.initializeApp({
    credential: admin.credential.cert(serviceAccount)
});

const corsMiddleware = cors({origin: true});

export const sendContactForm = functions.region(REGION).https.onRequest((request, response) => corsMiddleware(request, response, async () => {
    let {text} = request.body;
    let result = await admin.firestore().collection(COLLECTION_CONTACT_FORM).add({text});
    response.send((result.id));
}));

这是启动仿真器时的控制台输出:

[1] i  firestore: Serving WebChannel traffic on at http://localhost:8081
[1] i  firestore: Emulator logging to firestore-debug.log
[1] ✔  functions: Emulator started at http://localhost:5000
[1] ✔  firestore: Emulator started at http://localhost:8080
[1] i  functions: Watching "path/functions" for Cloud Functions...
[1] ⚠  functions: Your GOOGLE_APPLICATION_CREDENTIALS environment variable points to path/keys/auth-key.json. Non-emulated services will access production using these credentials. Be careful!
[1] ✔  functions[sendContactForm]: http function initialized (http://localhost:5000/project/europe-west1/sendContactForm).

触发本地端点时,将生产数据库写入其中。

1 个答案:

答案 0 :(得分:2)

firestore管理员initializeApp()将根据其运行位置正确处理本地模拟器和生产数据库之间的切换。因此,如果您只是删除服务帐户凭据,它将可以正常工作:

import * as functions from 'firebase-functions';
import * as cors from "cors";
import * as admin from "firebase-admin";

const REGION = "europe-west1";
const COLLECTION_CONTACT_FORM = "contact_form";

admin.initializeApp();
const corsMiddleware = cors({origin: true});

export const sendContactForm = functions.region(REGION).https.onRequest((request, response) => corsMiddleware(request, response, async () => {
    let {text} = request.body;
    let result = await admin.firestore().collection(COLLECTION_CONTACT_FORM).add({text});
    response.send((result.id));
}));

但是,如果由于某种原因,您试图写入创建项目所在的Firestore数据库之外的Firestore数据库,则可以将Firestore / grpc与firebase类分开使用,然后使用该环境来包含您的服务帐户凭据或位置模拟器凭据。本地仿真器示例:

const {Firestore} = require('@google-cloud/firestore');
const {credentials} = require('@grpc/grpc-js');

const db = new Firestore({
  projectId: 'my-project-id',
  servicePath: 'localhost',
  port: 5100,
  sslCreds: credentials.createInsecure(),
  customHeaders: {
    "Authorization": "Bearer owner"
  }
});

await db.collection("mycollection").doc("someid").set({ test: "value" });