Node.js NodeJS:分配给在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

我正在为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 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>
      }
    }
}