首页 > 解决方案 > 无效响应和空 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 对话中接收到所需的值。

标签: node.jsapialexaalexa-skills-kitalexa-skill

解决方案


推荐阅读