2017-07-19 2 views
0

Je suis actuellement en train d'essayer de créer une compétence Alexa qui émettra une alerte «Trouver mon iPhone» sur mes appareils Apple lorsque je donnerai les bonnes réponses à alexa. Je suis assez nouveau à développer pour le jeu de compétences alexa et le codage à ce sujet (en particulier dans node.js). Voici ma citation:Problème avec un objet indéfini dans Alexa Skills Intents personnalisés

var phoneId = "I have my values here"; 
var ipadId = "I have my values here"; 
var macId = "I have my values here"; 
var deviceId = ""; 


var APP_ID = ''; //replace with "amzn1.echo-sdk-ams.app.[your-unique-value-here]"; 

var AlexaSkill = require('./AlexaSkill'); 
var alexaResponse; 

//Import Apple.js 
var Apple = require('./Apple'); 
var apple = new Apple(); 

var alertSuccess = "Alert sent to Kenny's phone"; 
var alertFailed = "Alert couldn't be sent to Kenny's phone. Good luck finding it."; 

var FindDevice = function() { 
    AlexaSkill.call(this, APP_ID); 
}; 

// Extend AlexaSkill 
FindDevice.prototype = Object.create(AlexaSkill.prototype); 
FindDevice.prototype.constructor = FindDevice; 

FindDevice.prototype.eventHandlers.onSessionStarted = function (sessionStartedRequest, session) { 
    console.log("Quote onSessionStarted requestId: " + sessionStartedRequest.requestId 
     + ", sessionId: " + session.sessionId); 
    // any initialization logic goes here 
}; 

FindDevice.prototype.eventHandlers.onLaunch = function (launchRequest, session, response) { 
    console.log("Quote onLaunch requestId: " + launchRequest.requestId + ", sessionId: " + session.sessionId); 
    getWelcomeResponse(response); 
}; 

FindDevice.prototype.eventHandlers.onSessionEnded = function (sessionEndedRequest, session) { 
    console.log("Quote onSessionEnded requestId: " + sessionEndedRequest.requestId 
     + ", sessionId: " + session.sessionId); 
    // any cleanup logic goes here 
}; 

FindDevice.prototype.intentHandlers = { 
    // register custom intent handlers 
    "FindDeviceIntent": function (intent, session, response) { 
     determineDevice(intent, session, response); 
    } 
}; 

/** 
* Returns the welcome response for when a user invokes this skill. 
*/ 
function getWelcomeResponse(response) { 
    // If we wanted to initialize the session to have some attributes we could add those here. 
    var speechText = "Welcome to the Lost Device. Which device shall I find?"; 
    var repromptText = "<speak>Please choose a category by saying, " + 
     "iPhone <break time=\"0.2s\" /> " + 
     "Mac <break time=\"0.2s\" /> " + 
     "iPad <break time=\"0.2s\" /></speak>"; 

    var speechOutput = { 
     speech: speechText, 
     type: AlexaSkill.speechOutputType.PLAIN_TEXT 
    }; 
    var repromptOutput = { 
     speech: repromptText, 
     type: AlexaSkill.speechOutputType.SSML 
    }; 
    response.ask(speechOutput, repromptOutput); 
} 

    function determineDevice(intent, session, response) { 
    var deviceSlot = intent.slots.Device; 

    if (deviceSlot == "iPhone") { 
     deviceId = phoneId; 
     pingDevice(deviceId); 
    } else if (deviceSlot == "iPad") { 
     deviceId = ipadId; 
     pingDevice(deviceId); 
    } else if (deviceSlot == "Mac") { 
     deviceId = macId; 
     pingDevice(deviceId); 
    } else { 
     var speechText = "None of those are valid devices. Please try again."; 
     speechOutput = { 
      speech: speechText, 
      type: AlexaSkill.speechOutputType.PLAIN_TEXT 
     }; 
     response.tell(speechOutput); 
    } 
} 

    function pingDevice(deviceId) { 
    apple.sendAlert(deviceId, 'Glad you found your phone.', function(success, result){ 
     if(success){ 
      console.log("Alert Sent Successfully"); 
      var speechOutput = alertSuccess; 
      response.tell(speechOutput); 
     } else { 
      console.log("Alert Unsuccessful"); 
      console.log(result); 
      var speechOutput = alertFailed; 
      response.tell(speechOutput); 
     } 
    }); 
    } 

// Create the handler that responds to the Alexa Request. 
exports.handler = function (event, context) { 
    // Create an instance of the FindDevice skill. 
    var findDevice = new FindDevice(); 
    findDevice.execute(event, context); 
}; 

Voici l'erreur de lambda:

{ 
    "errorMessage": "Cannot read property 'PLAIN_TEXT' of undefined", 
    "errorType": "TypeError", 
    "stackTrace": [ 
    "getWelcomeResponse (/var/task/index.js:87:42)", 
    "FindDevice.eventHandlers.onLaunch (/var/task/index.js:58:5)", 
    "FindDevice.LaunchRequest (/var/task/AlexaSkill.js:10:37)", 
    "FindDevice.AlexaSkill.execute (/var/task/AlexaSkill.js:91:24)", 
    "exports.handler (/var/task/index.js:137:16)" 
    ] 
} 

Je comprends qu'il ya un objet non défini, mais pour la vie de moi je ne peux pas savoir où la le code ne va pas. J'essaie de prendre le Slot de mon intention et ensuite changer l'appareil à ping basé sur le mot de slot utilisé. Aussi parce que je suis si nouveau à ceci une grande partie du codage est juste fait en corrigeant les choses ensemble. J'ai trouvé que quand j'ai enlevé les lignes .PLAIN_TEXT tous ensemble le code a couru dans lambda, mais a ensuite cassé dans la zone de test de compétences alexa. J'ai l'intuition que je ne comprends pas comment les fentes des intentions sont passées, mais j'ai du mal à trouver des documents que je peux comprendre à ce sujet. Toute aide serait fantastique!

Répondre

0

Dans la fonction determDevice, vous accédez directement à l'objet d'emplacement "Périphérique" plutôt qu'à la valeur réelle transmise. Par conséquent, il ne correspondra jamais à l'ensemble prédéfini de noms de périphériques. Un objet d'emplacement possède un nom et une valeur. Si vous consultez le fichier JSON de demande de service dans le simulateur de service de la console développeur lorsque vous testez votre compétence Alexa, vous verrez un message du type: propriété

{ 
"session": { 
    "sessionId": "SessionId.dd05eb31-ae83-4058-b6d5-df55fbe51040", 
    "application": { 
    "applicationId": "amzn1.ask.skill.61dc6132-1727-4e56-b194-5996b626cb5a" 
    }, 
    "attributes": { 
    }, 
    "user": { 
    "userId": "amzn1.ask.account.XXXXXXXXXXXX" 
    }, 
    "new": false 
}, 
"request": { 
    "type": "IntentRequest", 
    "requestId": "EdwRequestId.6f083909-a831-495f-9b55-75be9f37a9d7", 
    "locale": "en-GB", 
    "timestamp": "2017-07-23T22:14:45Z", 
    "intent": { 
    "name": "AnswerIntent", 
    "slots": { 
     "person": { 
     "name": "person", 
     "value": "Fred" 
     } 
    } 
    } 
}, 
"version": "1.0" 
} 

Remarque J'ai une fente appelée « personne » dans ce cas, mais pour obtenir la valeur dans la fente, vous avez besoin d'accéder à la « valeur ». Dans votre exemple, vous modifiez la première ligne de la fonction determineDevice à:

var deviceSlot = intent.slots.Device.value; 

En aparté, j'ai trouvé la Alexa-cookbook Github repository une ressource essentielle pour apprendre à travailler avec le SDK Alexa, il y a des exemples dans là pour la plupart des scénarios.