snapshot.val () возвращает ноль, пока есть данные - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь получить информацию из базы данных Firebase Realtime внутри встроенного редактора Dialogflow с помощью Google Assistant, однако по какой-то причине я возвращаюсь null, Google Assistant отвечает person1's Alex is null

Правильно ли настроен таргетинг моей ссылки? Я впервые использую диалоговый поток и базу данных в реальном времени.

'use strict';
const functions = require('firebase-functions');
const {WebhookClient} = require('dialogflow-fulfillment');
const {Card, Suggestion} = require('dialogflow-fulfillment');
var admin = require('firebase-admin');
admin.initializeApp({
  credential: admin.credential.cert({
    projectId: ' ',
    clientEmail: ' ',
    privateKey: ' '
  }),
  databaseURL: 'https://*****.firebaseio.com'
});
process.env.DEBUG = 'dialogflow:debug';
// enables lib debugging statements
exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request,response)=>{
  const agent = new WebhookClient({
    request,
    response
  });
  console.log('Dialogflow Request headers: ' + JSON.stringify(request.headers));
  console.log('Dialogflow Request body: ' + JSON.stringify(request.body));

  function welcome(agent) {
    agent.add(`Welcome to my agent!`);
  }

  function fallback(agent) {
    agent.add(`I didn't understand`);
    agent.add(`I'm sorry, can you try again?`);
  }

  function personFacts(agent) {
    const personId = agent.parameters["personId"];
    const personMeasurement = agent.parameters["personMeasurement"];

    var db = admin.database();
    var ref = db.ref(`person/${personId}/${personMeasurement}`);
    return ref.once("value").then(snapshot=>{
      var result = snapshot.val();
      agent.add(`${personId}'s ${personMeasurement} is ${result}`);
    }).catch(err=>{
      agent.add('uh oh, something went wrong.');
      console.error(err);
    });
  }

  let intentMap = new Map();
  intentMap.set('Default Welcome Intent', welcome);
  intentMap.set('Default Fallback Intent', fallback);
  intentMap.set('person', personFacts);
  agent.handleRequest(intentMap);
});

Вот база данных в реальном времени: enter image description here

Как и предполагалось, я изменил числа 0, 1, 2 на person1, person2, person3 для ссылки на базу данных в реальном времени нужна небольшая помощь:

function personFacts(agent) {
    const personId = agent.parameters["personId"];
    const personMeasurement = agent.parameters["personMeasurement"];        
    const pperson = person[personId];

   const result = pperson[personMeasurement];       

    var db = admin.database();
    var ref = db.ref(`person/${personId}/${personMeasurement}`);
    return ref.once("value")
      .then( snapshot => {
        var result = snapshot.val();
        agent.add(`${personId}'s ${personMeasurement} is ${result}`); 
      })
      .catch( err => {
        agent.add('uh oh, something went wrong.');
      console.error( err );
      });

  }
   let intentMap = new Map();
      intentMap.set('Default Welcome Intent', welcome);
      intentMap.set('Default Fallback Intent', fallback);
      intentMap.set('person', personFacts);
      agent.handleRequest(intentMap);
    });

1 Ответ

0 голосов
/ 09 января 2019

Звучит так, будто вы запрашиваете информацию, спрашивая "person 1", но в базе данных нет ключа со значением "person1". В иерархии «человек» есть ключ «1», и, возможно, это то, что вам нужно.

У вас есть несколько вариантов, в зависимости от того, что вы на самом деле пытаетесь сделать.

Вы можете изменить свои ключи, чтобы отразить то, что вы просите. Таким образом, вместо того, чтобы использовать «0» или «1» или «2» для ваших ключей, вы можете просто использовать «person1», или «person2», или «person3». Вам не нужно использовать числа в базе данных Firebase. Вы можете использовать, как хотите, чтобы ссылаться на данные.

Другой альтернативой является сохранение ключей в базе данных, как у вас, и когда человек говорит «person1», каким-то образом сопоставить это с правильным ключом, который находится в базе данных (то есть - «0»). Вы можете написать код для этого - в этом случае вам нужна подстрока параметра personId. Так что, возможно, что-то вроде

let personKey = personId.substring(6);

и затем используйте personKey в вашем ссылочном пути

var ref = db.ref( `person/${personKey}/${personMeasurement}` );

Однако это всего лишь примеры - как вы это сделаете, зависит от того, как вы хотите структурировать и получить доступ к вашим данным.

Важной частью является понимание того, как база данных Firebase позволяет вам получить доступ к данным. Данные хранятся в иерархии, и мы можем думать, что каждый узел в этой иерархии имеет путь к нему. В вашем примере у вас есть один узел наверху с именем «персона». Под этим узлом находятся несколько узлов, которые являются просто числами - один из примеров - узел с именем «0». Под узлом "0" у вас есть несколько узлов, включая один с именем "Alex".

Вы можете ссылаться на этот конкретный узел "Алекс", указав полный путь к нему. Мы разделяем имя каждого узла знаком "/". Таким образом, полный путь к этому конкретному «Алексу» будет person/0/Alex. Чтобы получить значение в этом узле, мы можем построить объект ref и затем использовать once("value"), чтобы получить значение только один раз (в отличие от прослушивания его на предмет изменений).

Поскольку части этого «0» и «Alex» хранятся в переменных, нам нужно построить строку, содержащую эти значения. Одним из простых способов сделать это является использование литерала шаблона или "backtick string" в JavaScript. В этом типе строки оценивается все, что находится внутри ${}. Итак, ${personKey} означает вставить в строку значение personKey.

.

Итак, линия

var ref = db.ref( `person/${personKey}/${personMeasurement}` );

означает «создать ссылку на узел в базе данных, начиная с узла« персона », затем найти узел под этим значением со значением в personKey, затем найти узел под этим значением со значением в personMeasurement ».

Конечно, вы можете заменить personKey и personMeasurement на любые переменные, содержащие значения, которые вы будете искать в этой точке иерархии узлов. Вы можете построить эту строку другими способами и создать ссылку, используя другие инструменты. Важным моментом является понимание того, что ссылка относится к точке в базе данных и что вам необходимо создать эту ссылку, прежде чем вы сможете получить ссылку с этой точки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...