2016-11-08 3 views
0

Ce code fonctionne très bien:Encapsulation API.ai appel en une fonction javascript externe ne fonctionne pas

var apiai = require('apiai'); 
var app = apiai(<token>); 

var request = app.textRequest('jacket', { 
    'sessionId': 123456 
}); 

request.on('response', function(response) { 
    console.log(response); 
    console.log(response.result.fulfillment.speech); 
    console.log(response.result.metadata.intentName); 
}); 

request.on('error', function(error) { 
    console.log(error); 
}); 

request.end(); 

Et il produit la sortie de la console suivante:

{ id: '2865abde-ac8f-4ac3-816e-483c68f709d0', 
    timestamp: '2016-11-08T22:38:56.461Z', 
    result: 
    { source: 'agent', 
    resolvedQuery: 'jacket', 
    action: '', 
    actionIncomplete: false, 
    parameters: {}, 
    contexts: [ [Object] ], 
    metadata: 
     { intentId: '357af94f-00b3-4016-a661-732419ddafd6', 
     webhookUsed: 'false', 
     intentName: 'clothing' }, 
    fulfillment: { speech: 'clothing2', messages: [Object] }, 
    score: 0.6 }, 
    status: { code: 200, errorType: 'success' }, 
    sessionId: '123456' } 
clothing2 
clothing 

Cependant, lorsque je tente de briser cette part dans un appel de fonction, les choses ne fonctionnent pas si bien:

fichier: main.js

var apiai = require('apiai'); 
var app3 = apiai(<token>); 

exports.getresponse = function(inputstring){ 
    var request = app3.textRequest(inputstring, {'sessionId': 123456}); 
    request.on('response', function(response) { 
    return(response); 
}); 
    request.on('error', function(error) { 
    return(error); 
}); 
    request.end(); 
}; 

fichier: moda.js

var express = require("express"); 
var app = express(); 
var joe = require('./main.js'); 
console.log(joe.getresponse('jacket')); 
app.listen(3000); 

Quand je lance moda.js (moda.js de nœud), je ne reçois que

undefined 

comme la sortie de la console.

Qu'est-ce que je fais mal ici?

Merci beaucoup!

+0

Vous avez publiquement exposé votre jeton api.ai dans ce post. Vous DEVEZ régénérer ce jeton immédiatement. https: //docs.api.ai/docs/authentication – Alan

Répondre

1

joe.getresponse() ne dispose pas d'un retour explicite, donc il a une implicite return undefined;

C'est la raison pour laquelle vous voyez undefined dans la sortie de la console.

La raison est un peu compliquée, et fondamentale pour la programmation javascript, mais elle a à voir avec les Callbacks, et l'exécution asynchrone de javascript.

Avec cette ligne ici, vous ajoutez en fait une fonction anonyme comme rappel. Cette fonction n'est réellement exécutée que lorsqu'elle est invoquée (généralement en réponse à un événement).

request.on('response', function(response) { 
    return(response); 
}); 

Ainsi, alors que vous retournez la réponse, la portée de ce retour n'est pas dans la fonction extérieure getresponse(), mais l'intérieur de l'émetteur d'événements response. Au lieu de cela, vous devrez capturer la valeur Response de manière à pouvoir y accéder de manière déterministe. En fournissant votre propre rappel à la méthode getresponse(), ce rappel aura accès à l'objet de réponse.

Il serait ressemble à quelque chose comme ceci:

main.js

var apiai = require('apiai'); 
var app3 = apiai(<token>); 

exports.getresponse = function(inputstring,callback){ 
    var request = app3.textRequest(inputstring, {'sessionId': 123456}); 
    request.on('response', function(response) { 
    callback(null,response); 
}); 
    request.on('error', function(error) { 
    callback(error,null); 
}); 
    request.end(); 
}; 

moda.js

var express = require("express"); 
var app = express(); 
var joe = require('./main.js'); 
joe.getresponse('jacket', function(error,response) { 
    if(error) { console.error(error); } 
    console.log(response); 
}); 
app.listen(3000); 

au lieu de retourner la valeur de réponse, je suis appel d'une rappel de l'appelant fourni, qui gère ensuite la réponse (appelle console.log).

+0

Quand j'exécute ceci, j'obtiens une erreur référençant onResponse. Si je lis bien, la fonction onResponse doit être définie quelque part, correct? Est-ce le callback fourni par l'appelant auquel vous faites référence? – rucker

+0

@rucker Excuses. J'ai mis à jour le code. – Alan

+0

Yup. Maintenant, ça fonctionne très bien. Merci @Alan! – rucker