Node.js NodeJS:分配给在Firebase中异步检索的变量数据
我正在为Dialogflow聊天机器人开发一个简单的Firebase后端。该应用程序与一些数据库交互并从中检索数据。我的代码如下所示:Node.js NodeJS:分配给在Firebase中异步检索的变量数据,node.js,firebase,firebase-realtime-database,Node.js,Firebase,Firebase Realtime Database,我正在为Dialogflow聊天机器人开发一个简单的Firebase后端。该应用程序与一些数据库交互并从中检索数据。我的代码如下所示: function_A (assistant) { let key_a = assistant.getArgument(KEY_A_NAME); database_a.child(key_a).once("value", snap => { if (snap.val() == null) { //not reac
function_A (assistant) {
let key_a = assistant.getArgument(KEY_A_NAME);
database_a.child(key_a).once("value", snap => {
if (snap.val() == null) {
//not reachable
assistant.tell('Error Message');
}
else {
let result = snap.val()[PROPERTY_NAME]
<do_something_with result>
}
});
function\u A(助手){
让key\u a=assistant.getArgument(key\u a\u名称);
数据库a.child(键a).once(“值”,snap=>{
如果(snap.val()==null){
//无法到达
assistant.tell(“错误消息”);
}
否则{
让结果=snap.val()[属性名称]
}
});
}
功能(助理){
让key_B=assistant.getArgument(key_B_NAME);
database_B.child(key_B).once(“value”,snap=>{
如果(snap.val()==null){
//无法到达
告诉我(“错误消息”);
}
否则{
让结果=snap.val()[属性名称]
}
});
}
我现在想重构代码并重用数据库检索。我尝试了以下操作:
function function_A(assistant) {
let key_a = assistant.getArgument(KEY_A_NAME);
const property = retrieve_from_database(database_a, key_a, PROPERTY_A_NAME);
if (property == null) {
//not reachable
assistant.tell('Error Message');
}
else {
<do something with property>
}
}
function retrieve_from_database(db, key, entry_name) {
const ref = db.child(key);
return ref.once("value").then(function(snap) {
if (snap.val() == null) {
return null;
}
else {
return snap.val()[entry_name];
}
});
}
function\u A(助手){
让key\u a=assistant.getArgument(key\u a\u名称);
const property=retrieve_from_database(数据库_a、键_a、属性_a_名称);
if(属性==null){
//无法到达
assistant.tell(“错误消息”);
}
否则{
}
}
函数从\u数据库检索\u(数据库、键、条目\u名称){
const ref=db.child(键);
返回参考值一次(“值”)。然后(函数(捕捉){
如果(snap.val()==null){
返回null;
}
否则{
返回snap.val()[entry_name];
}
});
}
然而,retrieve_from_database函数返回一个Promise对象,尽管我读了很多关于Promises的文章,但我仍然不知道如何从中检索所需的信息并将其存储到变量中。这里似乎有一些基本的东西我没有理解。我对NodeJS和Firebase非常陌生。据我所知,你是e期待做:
function function_A(assistant) {
let key_a = assistant.getArgument(KEY_A_NAME);
retrieve_from_database(database_a, key_a, PROPERTY_A_NAME).then(function(property) {
if (property == null) {
assistant.tell('Error Message');
}
else {
<do something with property>
}
}
}
function\u A(助手){
让key\u a=assistant.getArgument(key\u a\u名称);
从\数据库(数据库\ a、键\ a、属性\ a \名称)检索\ U。然后(函数(属性){
if(属性==null){
assistant.tell(“错误消息”);
}
否则{
}
}
}
是的!很简单,但我就是不懂。谢谢。
function function_A(assistant) {
let key_a = assistant.getArgument(KEY_A_NAME);
retrieve_from_database(database_a, key_a, PROPERTY_A_NAME).then(function(property) {
if (property == null) {
assistant.tell('Error Message');
}
else {
<do something with property>
}
}
}