node.js - 无效响应和空 API 响应 - Alexa 对话问题
问题描述
我一直面临这种类型的错误 - INVALID_RESPONSE 和消息 - Api 响应不能为空使用代码中声明的 apiRequest 常量无法访问我试图作为 API 参数发送的插槽值
const GetRecommendationAPIHandler = {
canHandle(handlerInput) {
return Alexa.getRequestType(handlerInput.requestEnvelope) === 'Dialog.API.Invoked'
&& handlerInput.requestEnvelope.request.apiRequest.name === 'getRecommendation';
},
handle(handlerInput) {
const apiRequest = handlerInput.requestEnvelope.request.apiRequest;
let fuel = resolveEntity(apiRequest.slots, "fuel");
let size = resolveEntity(apiRequest.slots, "size");
let layout = resolveEntity(apiRequest.slots, "layout");
let gear = resolveEntity(apiRequest.slots, "gear");
let seats = resolveEntity(apiRequest.slots, "seats");
/*let fuel = "petrol";
let size = "hatchback";
let layout = "front";
let gear = "auto";
let seats = "5";*/
const recommendationResult = {};
if (fuel !== null && size !== null && layout !== null && gear !== null && seats !== null) {
const key = `${size}-${gear}-${fuel}-${layout}-${seats}`;
const databaseResponse = data[key];
console.log("Response from mock database ", databaseResponse);
recommendationResult.name = databaseResponse.name;
recommendationResult.size = apiRequest.arguments.size
recommendationResult.fuel = apiRequest.arguments.fuel
recommendationResult.layout = apiRequest.arguments.layout
recommendationResult.gear = apiRequest.arguments.gear
recommendationResult.seats = apiRequest.arguments.seats;
}
const response = buildSuccessApiResponse(recommendationResult);
console.log('GetRecommendationAPIHandler', JSON.stringify(response));
return response
}
};
// Resolve slot value using Entity Resolution
const resolveEntity = function(resolvedEntity, slot) {
//This is built in functionality with SDK Using Alexa's ER
let erAuthorityResolution = resolvedEntity[slot].resolutions //handlerInput.requestEnvelope.request.apiRequest.slots[slotname]
.resolutionsPerAuthority[0];
let value = null;
if (erAuthorityResolution.status.code === 'ER_SUCCESS_MATCH') {
value = erAuthorityResolution.values[0].value.name;
}
return value;
};
const buildSuccessApiResponse = (returnEntity) => {
return { apiResponse: returnEntity };
};
这是我用于解析值和发送响应的请求和函数的处理程序。
这是最后输入的 JSON
{
"version": "1.0",
"session": {
"new": false,
"sessionId": "amzn1.echo-api.session.a57315c6-ce4d-4489-942c-4ef989690ff4",
"application": {
"applicationId": "amzn1.ask.skill.0849491f-bd08-4325-82f5-96bd16812405"
},
"user": {
"userId": "amzn1.ask.account.AEHDHDZY7SHE4TUI4BBYW6TNPRCIQO227ZC2BEAMVSAXGKXOMKZQOXWNKBV2744ONCZQJ6PBPCUQX6Z4T6TYPKRF3TQBU4CBXLK677FPSCOVT6Y5NSRIS5NXWYEDPQL4AZNXMFMEFW2TUI3N77AHXPCWSQ4JTCVO67QRA6HXS3JML2MMAWTOFDKCGVIEXOT6JQRK2DNY2IW7N6Y"
}
},
"context": {
"Viewports": [
{
"type": "APL",
"id": "main",
"shape": "RECTANGLE",
"dpi": 213,
"presentationType": "STANDARD",
"canRotate": false,
"configuration": {
"current": {
"mode": "HUB",
"video": {
"codecs": [
"H_264_42",
"H_264_41"
]
},
"size": {
"type": "DISCRETE",
"pixelWidth": 1280,
"pixelHeight": 800
}
}
}
}
],
"Viewport": {
"experiences": [
{
"arcMinuteWidth": 346,
"arcMinuteHeight": 216,
"canRotate": false,
"canResize": false
}
],
"mode": "HUB",
"shape": "RECTANGLE",
"pixelWidth": 1280,
"pixelHeight": 800,
"dpi": 213,
"currentPixelWidth": 1280,
"currentPixelHeight": 800,
"touch": [
"SINGLE"
],
"video": {
"codecs": [
"H_264_42",
"H_264_41"
]
}
},
"Extensions": {
"available": {
"aplext:backstack:10": {}
}
},
"System": {
"application": {
"applicationId": "amzn1.ask.skill.0849491f-bd08-4325-82f5-96bd16812405"
},
"user": {
"userId": "amzn1.ask.account.AEHDHDZY7SHE4TUI4BBYW6TNPRCIQO227ZC2BEAMVSAXGKXOMKZQOXWNKBV2744ONCZQJ6PBPCUQX6Z4T6TYPKRF3TQBU4CBXLK677FPSCOVT6Y5NSRIS5NXWYEDPQL4AZNXMFMEFW2TUI3N77AHXPCWSQ4JTCVO67QRA6HXS3JML2MMAWTOFDKCGVIEXOT6JQRK2DNY2IW7N6Y"
},
"device": {
"deviceId": "amzn1.ask.device.AFBW6I6ELPET274UXWKL6DI6SEX6PXG4NUYUKVD5M6VFNG7WFXLSXMDQF2EJCVAEXVCMBR2T2ZH327CQ7MRUEMMNJX2Q5MVICDG3UQXT4VIFEWTHEYRAGB4TTXL5UVUVXXRLXPBFFPDJRTP5AN4LRWNPXICMCEFII7XYPUCR6QACIJY34WWES",
"supportedInterfaces": {
"Alexa.Presentation.APL": {
"runtime": {
"maxVersion": "1.7"
}
}
}
},
"apiEndpoint": "https://api.eu.amazonalexa.com",
"apiAccessToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IjEifQ.eyJhdWQiOiJodHRwczovL2FwaS5ldS5hbWF6b25hbGV4YS5jb20iLCJpc3MiOiJBbGV4YVNraWxsS2l0Iiwic3ViIjoiYW16bjEuYXNrLnNraWxsLjA4NDk0OTFmLWJkMDgtNDMyNS04MmY1LTk2YmQxNjgxMjQwNSIsImV4cCI6MTYyODMzMjM4NCwiaWF0IjoxNjI4MzMyMDg0LCJuYmYiOjE2MjgzMzIwODQsInByaXZhdGVDbGFpbXMiOnsiY29udGV4dCI6IkFBQUFBQUFBQVFCN0tmTFIwT2laTkxZYmNiWkJkWGI4S3dFQUFBQUFBQURMVEd6WnBQTEMwcG5penlzMVE1Y0VTa0lTNHdjZDFlWlFiQkZ6NithRjNjYkdEM3ZYOVJZeEthWFZnNllPM25qRHNuMC9LaE41Y29jc1RvL3VCWUYzSHZhc2FGK3VsNFdFUHFmOTBSL1hKVDJzbFIyMTNSbU1zUnpvOHlLSzFOYWNzNVFWUjR6VkVUTE4vc1czZEFCeVJZdUxBOHlJaGhqU0YwRmVIOGFPVVN4eVJhc1pGVmxNR3RmN0JCUk82TTBKdUNiUmNxS0hOZ1Q3ci9HR3BsVkJGbnU2cWVMUWt3a012VUxYSVp0M2dGZmNVQzg4L2pPV2RpRjQ3aTl5SXYvbzRVOEhnczhhdTZ1czVSZkFVTktUSTR3K0Y2MmNLUmdXbkNQdytKMnI0YVVnYlRMZFhuWk1JZHA4cTZhYzlna0ZyV0dtZTF5bXE4UTlGMTQzeTNCc3MvbGtLWnA3OEhaVlNNZGs1NklOVXl5VzJscVJ1WW9OSDZVZ29rL2ZTM3VUUnd1UnJOODJPRE5OMHc9PSIsImNvbnNlbnRUb2tlbiI6bnVsbCwiZGV2aWNlSWQiOiJhbXpuMS5hc2suZGV2aWNlLkFGQlc2STZFTFBFVDI3NFVYV0tMNkRJNlNFWDZQWEc0TlVZVUtWRDVNNlZGTkc3V0ZYTFNYTURRRjJFSkNWQUVYVkNNQlIyVDJaSDMyN0NRN01SVUVNTU5KWDJRNU1WSUNERzNVUVhUNFZJRkVXVEhFWVJBR0I0VFRYTDVVVlVWWFhSTFhQQkZGUERKUlRQNUFONExSV05QWElDTUNFRklJN1hZUFVDUjZRQUNJSlkzNFdXRVMiLCJ1c2VySWQiOiJhbXpuMS5hc2suYWNjb3VudC5BRUhESERaWTdTSEU0VFVJNEJCWVc2VE5QUkNJUU8yMjdaQzJCRUFNVlNBWEdLWE9NS1pRT1hXTktCVjI3NDRPTkNaUUo2UEJQQ1VRWDZaNFQ2VFlQS1JGM1RRQlU0Q0JYTEs2NzdGUFNDT1ZUNlk1TlNSSVM1TlhXWUVEUFFMNEFaTlhNRk1FRlcyVFVJM043N0FIWFBDV1NRNEpUQ1ZPNjdRUkE2SFhTM0pNTDJNTUFXVE9GREtDR1ZJRVhPVDZKUVJLMkROWTJJVzdONlkifX0.PBX0z-FjfXKFhXUdyyWlB2GhdUV4ayuEMr54Id-sT3yNsgOYlhgVrAy9GMR8lQOK1-ruabxWGMvqDT-WFqqCadtkinudBk_qUHl03Tto9OHmXZJgpWviPxoh-QkaLYpAae1ptGqj0ddWrK8UmPFuzPG7dfX2pBYlr8A_i5E5YSARlr_mq7WIak1aHDUU590EBxDLkoMg-Ln0l5-YuHUWdl3CRN4LXNfCLtoaIadK2_pd77qQeX8j-S2pRfZoB9PJhD9rbExK4W4v5b03TD_WCO8XkoxFGYT85vMm7-Rye0mffWkQQY-v54hU-OEu37EDZELVCAfa4l3taVAAhuKohQ"
}
},
"request": {
"type": "SessionEndedRequest",
"requestId": "amzn1.echo-api.request.8ad98851-6ece-4dce-88bd-d1ce69766fe1",
"timestamp": "2021-08-07T10:28:06Z",
"locale": "en-US",
"reason": "ERROR",
"error": {
"type": "INVALID_RESPONSE",
"message": "Api response cannot be null"
}
}
}
我不确定为什么我的 API 没有从 Alexa 对话中接收到所需的值。
解决方案
推荐阅读
- sql-server - sql中的函数acos在某些情况下失败
- git - GitHub API错误“超出速率限制”如何增加
- bash - 使用 wget 和 awk 从网站提取货币汇率
- android - android studio的设计部分没有看到布局,但它适用于设备
- python - 在单个命令 Opencv 中放置不同样式的文本
- php - Laravel 按数组分组 - 非法字符串偏移
- reactjs - 使用“动态导入”从另一台主机获取脚本?
- python-3.x - 隐藏seaborn pairplot的传说
- laravel - 如何按顺序运行 laravel 混合步骤?
- python - python从另一个函数调用一个函数