Запрос API встроенного редактора Dialogflow

Я пытаюсь заставить бота отвечать на информацию, полученную от 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


person Power    schedule 10.11.2019    source источник
comment
Какие именно ошибки вы получаете? Дайте нам некоторую обратную связь   -  person ZombieChowder    schedule 11.11.2019
comment
для вызова внешних API убедитесь, что ваш биллинг включен   -  person Nikhil Savaliya    schedule 11.11.2019
comment
и ваша функция должна возвращать обещание   -  person Nikhil Savaliya    schedule 11.11.2019
comment
Я не получаю никаких ошибок, просто не могу показать в ответе бота, что вернул api, в настоящее время я использую план платежей Blaze, чего не хватает, так это обещания возврата от функции   -  person Power    schedule 11.11.2019


Ответы (1)


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

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

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

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

return axios.get(apiUrl).then((result) => {
  // Rest of this call here
person Prisoner    schedule 11.11.2019
comment
Ответ обновлен, но см. Мой комментарий к вашему ответу выше. - person Prisoner; 11.11.2019