在 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()
.
在这里开始使用 async
和 await
可能最简单,这将使您的代码看起来像这样:
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;
});
});
谢谢!
我正在尝试从我的实时数据库中获取数据,但是当我这样做时,它 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()
.
在这里开始使用 async
和 await
可能最简单,这将使您的代码看起来像这样:
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;
});
});
谢谢!