2017-09-12 5 views
0

Cette erreur est similaire à ce que j'ai demandé here, mais cette fois c'est avec le client NodeJs. J'essaye de trouver des directions à un emplacement. Dès que l'intention est déclenchée sur mon webhook, je calcule les directions en utilisant GoogleMapAPI. Mais avant qu'il puisse finir et envoyer une réponse, je reçois l'erreur sur ma console d'actions.

J'ai vérifié le temps de réponse total et il est inférieur à 2 secondes, ce qui est inférieur à 5 secondes de timeout par Google.

Où je me trompe ???
API.ai Actions sur Google - Echec de l'analyse de la chaîne de réponse JSON avec l'erreur 'INVALID_ARGUMENT': ": champ introuvable."

Mon intention API.ai
enter image description here enter image description here

En utilisant express.js avec nœud d'action sur Google-client

'use strict'; 

const express = require('express'); 
const bodyParser = require('body-parser'); 
const intentHandler = require('./intent_handler') 

const app = express(); 
app.use(bodyParser.json()); 

const ApiAiAssistant = require('actions-on-google').ApiAiAssistant; 

// Create functions to handle requests here 
.... 
.... 
const DIRECTION_INTENT = 'action_direction'; 

function MyAssistant(req, res) { 
    const assistant = new ApiAiAssistant({request: req, response: res}); 
    assistant.handleRequest(responseHandler(assistant)); 
} 


function responseHandler (assistant) { 
    // intent contains the name of the intent you defined in the Actions area of API.AI 
    let intent = assistant.getIntent(); 
    switch (intent) { 
     case WELCOME_INTENT: 
      ... 
      break; 
     case WELCOME_FALLBACK_PERMISSION_INTENT: 
      ... 
      break; 
     case DIRECTION_INTENT: 
      console.log(">>>>>>>DIRECTION_INTENT<<<<<<<"); 
      intentHandler.directionIntent(assistant); 
      break; 
    } 
} 
app.post('/', function (req, res) { 
    MyAssistant(req, res); 
}); 
app.listen(8080, function() { 
    console.log('app listening on port 8080!') 
}); 


code Handler

'use strict'; 
const speech = require("./speech_template"); 

const direction = require("./directionModule"); 

const intent_handler = { 

    'welcomeIntent': function (assistant) { 
     ..... 
    }, 

    'welcomeFallbackPermissionIntent': function (assistant) { 
     ..... 

    }, 

    'directionIntent':function (assistant) { 
     console.log('direction intent'); 
     direction.getDirectionWithSavedAddress(function (response) { 
      assistant.ask(response); 
     }); 
    } 
}; 

module.exports = intent_handler; 


Extraction de sens --- erreur est sur la console d'action avant que ce se termine

'use strict'; 

const striptags = require('striptags'); 
const speech = require("./speech_template"); 

let googleMapsClient = require('@google/maps').createClient({ 
    key: global.GOOGLE_DIRECTION_KEY 
}); 

const directionModule = { 
    'getDirectionWithSavedAddress': function (eventCallback) { 
     let myAdd = <From Saved Data>; 
     if (myAdd === undefined) { 
      console.log("error......"); 
     } 
     let destination = <From Saved Data>; 
     this.getDirectionWithAddress(myAdd, destination, function (dir) { 
      .... 
      if(SUCCESS){ 
       eventCallback(`<speak> ${steps} </speak>`); 
      }else{ 
       eventCallback(`<speak> ${speech.ERROR_DIRECTIONS} </speak>`); 
      } 
     }); 
    }, 
    'getDirectionWithAddress': function (add1, add2, eventCallback) { 
     let dir = {}; 
     googleMapsClient.directions({ 
      origin: add1, 
      destination: add2, 
      mode: "driving", 
      departure_time: "now" 
     }, function (err, response) { 
      if (!err) { 
       console.log(response.json.routes[0]); 
       .... 
       .... 
       .... 
      } else { 
       console.log(`Error --> ${err.toString()}`); 
       .... 
      } 
      eventCallback(dir); 
     }); 
    } 
}; 

module.exports = directionModule; 

MISE À JOUR Je courais le code local via WebStorm et l'exposition webhook via port à l'aide ngrok.

Update2
DEMANDE BAD 400

enter image description here

{ 
    "originalRequest": { 
     "source": "google", 
     "version": "2", 
     "data": { 
      "isInSandbox": true, 
      "surface": { 
       "capabilities": [ 
        { 
         "name": "actions.capability.AUDIO_OUTPUT" 
        } 
       ] 
      }, 
      "inputs": [ 
       { 
        "rawInputs": [ 
         { 
          "query": "get me there", 
          "inputType": "VOICE" 
         } 
        ], 
        "arguments": [ 
         { 
          "rawText": "get me there", 
          "textValue": "get me there", 
          "name": "text" 
         } 
        ], 
        "intent": "actions.intent.TEXT" 
       } 
      ], 
      "user": { 
       "locale": "en-US", 
       "userId": "<uID>" 
      }, 
      "device": {}, 
      "conversation": { 
       "conversationId": "<cID>", 
       "type": "ACTIVE", 
       "conversationToken": "[\"_actions_on_google_\",\"defaultwelcomeintent-followup\"]" 
      } 
     } 
    }, 
    "id": "<ID>", 
    "timestamp": "2017-09-12T17:08:10.321Z", 
    "lang": "en", 
    "result": { 
     "source": "agent", 
     "resolvedQuery": "get me there", 
     "speech": "", 
     "action": "action_direction", 
     "actionIncomplete": false, 
     "parameters": {}, 
     "contexts": [ 
      { 
       "name": "_actions_on_google_", 
       "parameters": {}, 
       "lifespan": 99 
      }, 
      { 
       "name": "google_assistant_input_type_voice", 
       "parameters": {}, 
       "lifespan": 0 
      }, 
      { 
       "name": "actions_capability_audio_output", 
       "parameters": {}, 
       "lifespan": 0 
      }, 
      { 
       "name": "defaultwelcomeintent-followup", 
       "parameters": {}, 
       "lifespan": 4 
      } 
     ], 
     "metadata": { 
      "intentId": "<iID>", 
      "webhookUsed": "true", 
      "webhookForSlotFillingUsed": "false", 
      "nluResponseTime": 15, 
      "intentName": "DirectionIntent" 
     }, 
     "fulfillment": { 
      "speech": "", 
      "messages": [ 
       { 
        "type": 0, 
        "speech": "" 
       } 
      ] 
     }, 
     "score": 1 
    }, 
    "status": { 
     "code": 200, 
     "errorType": "success" 
    }, 
    "sessionId": "<sID>" 
} 

Cela ressemble avant mon rappel est terminé, mon webhook envoie une réponse vide aux actions Google.
Pourquoi cela se passe-t-il et comment le résoudre ?????

+0

Puisque vous utilisez ngrok, pouvez-vous également publier la réponse HTTP ** ** que ngrok enregistre? Vous devriez être capable d'aller à l'URL de la console de ngrok pour voir ceci. – Prisoner

+0

Mis à jour ... il y a 400 erreur !! –

+0

ma réponse webhook se déclenche avant même que le rappel ne se termine ... pourquoi ??? –

Répondre

0

Le problème réside dans la façon dont votre fonction directionIntent() appelle et gère le résultat de votre fonction getDirectionWithSavedAddress(). Il s'attend getDirectionWithSavedAddress()renvoie une fonction, lorsque ce n'est pas le cas. Au lieu de cela, getDirectionWithSavedAddress() s'attend à envoyer ses résultats à un rappel .

Ainsi, après avoir appelé getDirectionWithAddress(), la fonction se termine sans rien renvoyer. Ce "rien" est envoyé à assistant.ask(), qui renvoie cela au serveur de Google. Ceci est une réponse invalide, donc vous obtenez l'erreur.

La résolution devrait être simple. Vous devez appeler getDirectionWithSavedAddress() avec une fonction de rappel. Dans cette fonction, vous devez appeler assistant.ask() avec la valeur envoyée au rappel.

Alors directionIntent() pourrait ressembler à quelque chose comme

'directionIntent':function (assistant) { 
     console.log('direction intent'); 
     direction.getDirectionWithSavedAddress(function(msg){ 
     assistant.ask(msg); 
     }); 
    } 

Mise à jour

Cette ligne n'a pas de sens:

assistant.handleRequest(responseHandler(assistant)); 

La fonction assistant.handleRequest() est censé être passé une carte des noms d'intention aux fonctions à appeler pour gérer l'événement. Vous le faites manuellement dans la fonction responseHandler() et vous ne renvoyez pas de carte. Comme vous ne renvoyez pas une carte, elle échoue lorsque vous tentez d'exécuter le code handleRequest() et génère l'erreur "Erreur d'action: le gestionnaire de requêtes ne peut PAS être vide".

Vous pouvez résoudre ce problème en appelant simplement responseHandler(assistant) et ne traitant pas du tout handleRequest(). Ou vous pouvez créer la carte que handleRequest() attend et se débarrasser de responseHandler() complètement.

+0

désolé je l'ai manqué lors de l'édition ... Je le renvoie via un rappel seulement –

+0

maintenant mis à jour ... erreur est même –

+0

mis à jour avec une réponse supplémentaire – Prisoner