首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Alexa Skills Custom Intents中未定义对象的问题

Alexa Skills Custom Intents中未定义对象的问题
EN

Stack Overflow用户
提问于 2017-07-19 12:30:50
回答 1查看 563关注 0票数 0

我目前正在尝试做一个Alexa的技巧,当我给alexa一个正确的提示时,它会向我的苹果设备发出一个“找到我的iPhone”的提示。我对alexa技能集的开发和编码非常陌生(特别是在node.js中)。以下是我的原话:

代码语言:javascript
复制
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);
};

这是来自lambda的错误:

代码语言:javascript
复制
{
  "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)"
  ]
}

我知道这里有一个未定义的对象,但对于我来说,我找不出代码在哪里出错。我正在尝试从我的意图中取出插槽,然后根据所使用的插槽字将设备更改为ping。另外,因为我对此还很陌生,所以很多编码都是通过将东西拼凑在一起来完成的。我确实发现,当我删除所有的.PLAIN_TEXT代码行时,代码在lambda中运行,但随后在alexa技能测试区中断。我有一种预感,我不明白来自意图的插槽是如何传递的,但我在寻找我能理解的材料方面遇到了困难。任何帮助都是很棒的!

EN

回答 1

Stack Overflow用户

发布于 2017-07-24 06:33:08

在determineDevice函数中,您将直接访问" device“插槽对象,而不是传入的实际值,因此它永远不会与您预定义的一组设备名称匹配。

slot对象有一个名称和一个值--当您在测试Alexa技能时,如果您在开发人员控制台的服务模拟器中查看Service Request JSON,您将看到类似以下内容:

代码语言:javascript
复制
{
"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"
}

注意,在本例中,我有一个名为"person“的槽,但要获取槽中的值,您需要访问" value”属性。在您的示例中,您可以将determineDevice函数的第一行更改为:

代码语言:javascript
复制
var deviceSlot = intent.slots.Device.value;

顺便说一句,我发现Alexa-cookbook Github repository是学习如何使用Alexa SDK的重要资源,其中有大多数场景的示例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45181004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档