get http desde fulf...
 

get http desde fulfillment en node.js  

  RSS
mporcile
(@mporcile)
Active Member
Hola!
Estoy practicando/aprendiendo node.js en DialogFlow, tiene un sector donde puedo escribir c贸digo, que es almacenado y ejecutado en Google Cloud Firebase.

Lo que me sucede es que ejecuto una funci贸n para llamar a una API mediante un GET http. la respuesta llega, la puedo parsear y queda registrada en el LOG, pero no llega a salir en el chatbot de dialogflow.
Al principio y al final de la funci贸n pongo un agent.add('texto'); para identificar el comienzo y el fin de la funci贸n. Luego del registro en el LOG ejecuto agent.add('output ' + body.text); que sacar铆a por el chatbot el resultado de la API, pero NO sale nada por el chatbot.

En los logs se ve que hay una diferencia de tiempos de respuesta, por lo que supongo que la respuesta llega 2 segundos despu茅s, se logra registrar en el log, pero ya se le pas贸 el tiempo para salir como respuesta del chatbot.
Agrego abajo los printscreen de los logs y la consola de prueba del chatbot.

El punto es, 驴c贸mo hacer para meter una respuesta que viene de un API cuando 茅sta tarda unos segundos en llegar?

Gracias!

function prueba(agent) {
agent.add('comienzo de function');
var request = require('request');
const requesthttp = require('request');
if (err) { return console.log(err); }
console.log(body.lang);
console.log(body.text);
agent.add('output ' + body.text);
});
agent.add('fin de function');
}
Citar
Respondido : 24/10/2019 3:30 pm
mporcile
(@mporcile)
Active Member

Agrego ac谩 el registro del LOG, donde se ve que la respuesta de la API llega al log, pero unos segundos despues. Y en el chatbot no aparece la respuesta.

ResponderCitar
Respondido : 24/10/2019 3:31 pm
Fabricio
(@fabricio)
Eminent Member

Hola mporcile: En particular trabajo con PHP, no se de Node.js. De igual forma, has intentado quitar el log en consola? Intenta meter la respuesta en una variable, quita los logs e imprime la variable a ver qu茅 resulta, pero no creo que sea eso. Ten tambi茅n en cuenta que est谩s concatenando un string con un array en la salida al agente, por la foto que muestras. Es posible que esa l铆nea est茅 mal codificada, y sea algo como agent.add('output: '+body.text[0]); Espero encuentres la soluci贸n. Un abrazo

ResponderCitar
Respondido : 25/10/2019 12:04 am
mporcile
(@mporcile)
Active Member

Hola @fabricio, gracias por responder.

He descubierto que es un problema de sincronizaci贸n, en el log la respuesta aparece unos segundos despu茅s de terminada la funci贸n. Hay que aprender algo que se llama Promise.聽
Y con respecto a la codificaci贸n, no es por ese lado, ya que ni poniendo en la siguiente linea de registro en el log un agent.add('hola mundo'); logra salir en el chat.

Y tengo habilitada la opci贸n de pago, que sin eso no permite al fulfillment comunicarse con APIs externas.聽

This post was modified hace 3 semanas by mporcile
ResponderCitar
Respondido : 25/10/2019 1:06 pm
Fabricio
(@fabricio)
Eminent Member

Buenas mporcile: Ten en cuenta, seg煤n lo poco que he visto, que Node.js es nativamente as铆ncrono. Quiz谩s debas o hacer una petici贸n a la API de forma s铆ncrona, o como es en c#, con async/ await realizar una petici贸n as铆ncrona y asignarle un m茅todo callback para llamarlo una vez devuelta la petici贸n. Saludos

ResponderCitar
Respondido : 25/10/2019 1:58 pm
Fabricio
(@fabricio)
Eminent Member

mporcile: Yo otra vez. Me intrig贸 tu consulta y encontr茅 esta soluci贸n:

https://stackoverflow.com/questions/50898457/unable-to-send-response-to-dialogflow

Luego tambi茅n encontr茅 en stackOverflow esta respuesta relacionada, no s茅 si ser谩 as铆:

The free聽Spark聽plan on Firebase Cloud Functions doesn't allow calls to domains outside Google.

You will need to upgrade to one of the paid plans such as the聽Flame聽or聽Blaze聽plan, which requires a credit card on file. For low levels of usage, however, you won't be charged on聽Blaze.

The image below shows聽Spark,聽Flame, and聽Blaze. Notice the聽Google services only聽for聽Spark.聽 https://firebase.google.com/pricing

ResponderCitar
Respondido : 25/10/2019 2:16 pm
mporcile
(@mporcile)
Active Member

@fabricio

Encontr茅 una soluci贸n. Y funciona. Antes hay que pasar al Firebase a modalidad de pago Blaze.

      function weatherAPI() {
        const url = "https://samples.openweathermap.org/data/2.5/weather?q=London,uk&appid=b6907d289e10d714a6e88b30761fae22";

        return new Promise((resolve, reject) => {

            https.get(url, function(resp) {
                var json = "";
                resp.on("data", function(chunk) {
                    console.log("received JSON response: " + chunk);
                    json += chunk;
                });

                resp.on("end", function() {
                    let jsonData = JSON.parse(json);
                    let chat = "The weather is " + jsonData.weather[0].description;
                    resolve(chat);
                });

            }).on("error", (err) => {
                reject("Error: " + err.message);
            });

        });
      }

ResponderCitar
Respondido : 01/11/2019 12:43 am
Share:

Por favor Iniciar Sesi贸n o Registro