在 Cloud Function return 中获取实时数据库错误的对象

Fetching Realtime Database in Cloud Function return the wrong object

我正在尝试从我的实时数据库中获取数据,但是当我这样做时,它 return 我的这个对象:

{"domain":{"domain":null,"_events":{},"_eventsCount":3,"members":[]}} instead of something like this: {0: 'user1', 1: 'user2'}.

我的实时数据库中有一个屏幕:

我的代码:

const functions = require("firebase-functions");

const admin = require("firebase-admin");
admin.initializeApp(functions.config().firebase);

exports.getProductTypeUpdate = functions.database
    .ref("Products/{product}/type")
    .onUpdate((snapshot, context) => {
      const type = snapshot.after.val();
      console.log("Product type created: " + type);
      const users = admin.database().ref("Notif/type/" + type)
          .once("value").then((snapshot) => {
            return snapshot.val();
          }).catch((error) => {
            console.log("Error sending message:", error);
            return false;
          });
      console.log("Users fetched are: " + JSON.stringify(users));
      const result = {etat: "create", users: users};
      console.log("Final result is: " + JSON.stringify(result));
      return result;
    });

还有“错误”(用法语写的,但并不重要):

感谢您的帮助!

问题是您的 users 变量实际上是 Promise。要将其记录在代码中,您必须 await 或使用 then().

在这里开始使用 asyncawait 可能最简单,这将使您的代码看起来像这样:

exports.getProductTypeUpdate = functions.database
  .ref("Products/{product}/type")
  .onUpdate(async (snapshot, context) => {
          // 
    const type = snapshot.after.val();
    try {
      const snapshot = await admin.database().ref("Notif/type/" + type).once("value");
      let users = snapshot.val();
      const result = {etat: "create", users: users};
      return result;
    }
    catch (error) {
      console.log("Error sending message:", error);
      return false;
    }
  });

我还建议阅读 sync, async, promises and how to terminate functions, and the MDN documentation on async/await 上的 Firebase 文档。

我做到了,但我认为我的 Node.js 版本无法 运行 ES6,我收到类似“意外令牌”的消息,所以我做到了,现在它可以工作了:

exports.getProductTypeUpdate = functions.database
.ref("Products/{product}/type")
.onUpdate((snapshot, context) => {
  // on récupère le type du produit
  const type = snapshot.after.val();
  console.log("Le type du produit créé est: " + type);
  // on récupère les utilisateurs interresse par le type d'objet
  admin.database().ref("Notif/type/" + type)
      .once("value").then((snapshot) => {
        const users = snapshot.val();
        console.log("Les utilisateurs dans " +
        "le snapshot sont:" + snapshot.val());
        console.log("Les utilisateurs tirés sont: " + users);
        // Retourne les utilisateurs à notifier et l'état de la requête
        const result = {state: "create", users: users};
        console.log("Le résultat final est: " + JSON.stringify(result));
        return result;
      }).catch((error) => {
        console.log("Error sending message:", error);
        return false;
      });
});

谢谢!