API-запрос встроенного редактора выполнения диалога - PullRequest
1 голос
/ 11 ноября 2019

Я пытаюсь заставить бота отвечать на информацию, полученную от API, не могу заставить его работать, хотя.

В журнале консоли Firebase я вижу, что API действительно отвечает информацией, которую янужно.

Весь код ниже:


'use strict';

const axios = require('axios');

const functions = require('firebase-functions');
const {WebhookClient} = require('dialogflow-fulfillment');
const {Card, Suggestion} = require('dialogflow-fulfillment');

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 callAPI(agent){

    const food = agent.parameters.Food;
    const subject = agent.parameters.Subject;
    const number = agent.parameters.number;

    const question = subject + " "+number +" "+food;
    const questionReady = question.replace(/ /g, '+');

    const apiKey = "key";
    const baseUrl = "https://api.spoonacular.com/recipes/quickAnswer?q=";

    const apiUrl =  baseUrl + questionReady + "&apiKey=" + apiKey;

    axios.get(apiUrl).then((result) => {
        console.log(result);   
        console.log(result.data);   
        console.log(result.data.answer);

        agent.add(result);
        agent.add(result.data);
        agent.add(result.data.answer);

    });


  }


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

Журнал консоли Firebase:

Посмотреть сообщение на imgur.com

1 Ответ

0 голосов
/ 11 ноября 2019

Наиболее вероятная причина в том, что вы не используете вызов функции Promise или async, поэтому ваш обработчик ничего не возвращает до завершения вызова API.

Чтобы это исправить,callAPI() необходимо вернуть Обещание, которое возвращает axios.get(). Аналогично, ваш обработчик намерений, который вызывает callAPI(), должен также возвратить это обещание (или другое обещание из блока then()).

Библиотека Dialogflow требует этого, поэтому она знает, что нужно ждать вызова API длязавершить (и обещание, таким образом, выполнить) перед возвратом чего-либо пользователю.

В вашем случае это так же просто, как изменить вызов на axios.get() на что-то вроде

return axios.get(apiUrl).then((result) => {
  // Rest of this call here
...