首页 > 解决方案 > 带有 TypeScript 的 Firebase Cloud Functions:实时数据库更新以成功结束但没有更新任何内容,JS 工作正常

问题描述

我使用 Firebase CLI 将 Cloud Functions 添加到 Firebase 项目。我从 JavaScript 开始,设法编写工作代码。

然后我决定改用 TypeScript。所以我决定删除所有与 Cloud Functions JS 相关的文件,并firebase init从头开始使用 cmd。我将代码从 index.js 复制到 index.ts,只需要更改 dataMap Map 的声明方式。

因此,现在每当我查看 Firebase 上的控制台日志时,一切似乎都运行良好,一切都已注销,并且我在客户端收到了成功消息。

然而,实时数据库中什么也没有发生,没有更新,没有任何数据的踪迹。

我对 JS / TS 几乎一无所知,因此欢迎所有关于代码和解决方案的建议。

我正在使用节点:14.17.6 并将 firebase-tools 更新为 9.18.0,将 firebase-admin 更新为 9.11.1,将 firebase-functions 更新为 3.15.6。

import * as functions from "firebase-functions";
import * as admin from "firebase-admin";
admin.initializeApp();

exports.createItemWithVIP = functions.region("europe-west1").
    https.onCall((data, context) => {
      // Checking that the user is authenticated.
      if (!context.auth) {
        console.log("Unauthenticated request");
        throw new functions.https.HttpsError("permission-denied", "You have" +
          " no permission to perform this operation");
      }

      // item details
      const foo = data.foo;
      const bar = data.bar;
      console.log(`foo: ${foo}, bar: ${bar}`);

      const userUID = context.auth.uid;
      console.log(`userUID: ${userUID}`);

      const db = admin.database();
      // get new item uid
      const somePathTableReference = db.ref("somePath/").push();
      const itemUID = `${somePathTableReference}`
          .split("somePath/")[1];
      console.log(`itemUID: ${itemUID}`);

      const itemPath = `somePath/${itemUID}`;
      const userPath = `users/${userUID}/somePath/${itemUID}`;

      const dataMap = new Map<string, unknown>();
      dataMap.set(`${itemPath}/vip/${userUID}`, true);
      dataMap.set(`${itemPath}/foo`, foo);
      dataMap.set(`${itemPath}/bar`, bar);
      dataMap.set(`${userPath}/role`, "vip");
      dataMap.set(`${userPath}/foo`, foo);
      dataMap.set(`${userPath}bar`, bar);

      dataMap.forEach((value: unknown, key: string) =>
        console.log(key, value));

      return db.ref("/").update(dataMap).then(() => {
        console.log(`Added new item with key: ${itemUID} ` +
          `; added vip role to user ${userUID}`);
        return {"message": "Success"};
      }).catch((e) => {
        console.log(`Error: ${e}`);
        throw new functions.https.HttpsError("unknown", "Unknown error" +
          "occured");
      });
    });


标签: node.jstypescriptfirebasefirebase-realtime-databasegoogle-cloud-functions

解决方案


我不完全确定原因,但直接用对象更新而不是new Map()似乎正在工作(是的,它不适用于我的地图):

const dMap = {
  [`${itemPath}/vip/${userUID}`]: true,
  [`${itemPath}/foo`]: foo,
  [`${itemPath}/bar`]: bar,
  [`${userPath}/role`]: "vip",
  [`${userPath}/foo`]: foo,
  [`${userPath}bar`]: bar
}

try {
  await db.ref("/").update(dMap);
  console.log(`Added new item with key: ${itemUID}; added vip role to user ${userUID}`);

  return {"message": "Success"};
} catch (e) {
  console.log(`Error: ${e}`);
  throw new functions.https.HttpsError("unknown", "Unknown error" +
    "occured");
}

推荐阅读