簡體   English   中英

使用ask-sdk-core自定義技能的Alexa sdk v2失敗,原因:會話終止,原因:ERROR

[英]Alexa sdk v2 using ask-sdk-core custom skill fails with : Session ended with reason: ERROR

我正在開發一種自定義技能,並且對此意圖有一些麻煩,也就是說,在if / else控制流中滿足所有條件的最后階段,我的意思是當它到達最后的else語句時,該命令無法返回預期的響應,但是所有返回的響應都可以正常工作,在這里我可能會遺漏什么:請密切注意resolve(handlerInput.responseBuilder.speak .... etc)的最后一部分。 我不確定我現在在做什么,我將不勝感激

const SetDefaultLocationIntentInProgress = {
      canHandle(handlerInput) {
        return handlerInput.requestEnvelope.request.type === 'IntentRequest'
        && handlerInput.requestEnvelope.request.intent.name === 'SetDefaultLocationIntent';
      }, 
       handle(handlerInput) {
        console.log(`In SetDefaultLocationIntentInProgress`);
        let cardTitle = speech.getCardTitle('setdefaultloc1');

        let city = '';
        let state = '';
        let zipcode = '';


        const { attributesManager, responseBuilder } = handlerInput;
        const sessionAttributes = attributesManager.getSessionAttributes();

        const currentIntent = handlerInput.requestEnvelope.request.intent;


        if (sessionAttributes[currentIntent.name]) {
            const tempSlots = sessionAttributes[currentIntent.name].slots;
            for (const key in tempSlots) {
                if (tempSlots[key].value && !currentIntent.slots[key].value) {
                    currentIntent.slots[key] = tempSlots[key];
                }
            }
        }

        sessionAttributes[currentIntent.name] = currentIntent;
        attributesManager.setSessionAttributes(sessionAttributes);

        if (currentIntent.slots.City && currentIntent.slots.City.value) {
            // User provided value for City slot
            city = currentIntent.slots.City.value;
        }

        if (currentIntent.slots.State && currentIntent.slots.State.value) {
            // User provided value for State slot
            state = currentIntent.slots.State.value;
        }

        if (currentIntent.slots.Zipcode && currentIntent.slots.Zipcode.value) {
            // User provided value for Zipcode slot
            zipcode = currentIntent.slots.Zipcode.value;
        }

        debugLog(`City: ${city}, State: ${state}, Zipcode: ${zipcode}`);

        let speechOutput = '';
        let repromtText = '';

        if (city.length === 0 && state.length === 0 && zipcode.length === 0) {
            // No values provided by user for city, state or zipcode
            speechOutput = speech.getSpeechText('setdefaultloc5');
            repromtText = speech.getSpeechText('reprompt2');
            return handlerInput.responseBuilder
            .speak(speechOutput)
            .reprompt(repromtText)
            .withSimpleCard(cardTitle, speechOutput)
            .withShouldEndSession(false)
            .getResponse();
        }else if(zipcode.length > 0 && !zipCodeValidator(zipcode) ) {
            // user provided a zipcode but it is not a valid US zipcode
            let speechObject = speech.getSpeechObject('setdefaultloc7');
            speechOutput = util.format(speechObject.text, zipcode);
            repromtText = speech.getSpeechText('reprompt3');
            return handlerInput.responseBuilder
            .speak(speechOutput)
            .reprompt(repromtText)
            .withSimpleCard(cardTitle, speechOutput)
            .withShouldEndSession(false)
            .getResponse();

        }else {

            let params = '';
            let lookupFunc = '';
            let placeNameLookup = '';
            if (zipcode.length > 0 && zipCodeValidator(zipcode)) {
                params = zipcode;
                lookupFunc = apiCalls.zipcodeLookup;
            }else {
                if (state.length === 0) {
                    params = city;
                    placeNameLookup = city;
                }else{
                    params = `${city}+${state}`;
                    placeNameLookup = `${city} ${state}`;
                }
                lookupFunc = apiCalls.placeNameLookup;
            }

            lookupFunc (params,  (error, result, duration) => {

                if(error || result === null) {
                    // API Call failed or result is null 
                    speechOutput = speech.getSpeechText('error2', false);
                    repromtText = speech.getSpeechText('reprompt3', false);

                    return handlerInput.responseBuilder
                    .speak(speechOutput)
                    .reprompt(repromtText)
                    .withSimpleCard(cardTitle, speechOutput)
                    .withShouldEndSession(false)
                    .getResponse();
                }else if (Object.keys(result).length === 0) {
                    // Returned an empty result
                    if (zipcode.length > 0) {
                        // was zipcode 
                        let speechObject = speech.getSpeechObject('setdefaultloc4');
                        repromtText = speech.getSpeechText('reprompt3', false);


                        speechOutput = util.format(speechObject.text, zipcode);

                    }else{
                        // wasn't zipcode
                        let speechObject = speech.getSpeechObject('setdefaultloc3');

                        repromtText = speech.getSpeechText('reprompt3', false);

                        speechOutput = util.format(speechObject.text, zipcode);

                    }
                    return handlerInput.responseBuilder
                        .speak(speechOutput)
                        .reprompt(repromtText)
                        .withSimpleCard(cardTitle, speechOutput)
                        .withShouldEndSession(false)
                        .getResponse();
                }else {
                    // Api Call successfull with result objects length > 0
                    return new Promise( (resolve, reject) => {
                        handlerInput.attributesManager.getPersistentAttributes()
                            .then((attributes) => {
                                const defaultLoc = {
                                    name: result.name,
                                    lat: result.lat,
                                    lon: result.lon
                                };
                                const userId = handlerInput.requestEnvelope.context.System.user.userId;
                                attributes['defaultLoc'] = defaultLoc;

                                debugLog("Writing attributes to DynamoDB: " + userId + ", " + "defaultlocation: " + JSON.stringify(defaultLoc));
                                handlerInput.attributesManager.setSessionAttributes(attributes);
                                handlerInput.attributesManager.setPersistentAttributes(attributes);
                                handlerInput.attributesManager.savePersistentAttributes();

                                let speechObject = speech.getSpeechObject('setdefaultloc22');
                                repromtText = speech.getSpeechText('reprompt3', false);

                                speechOutput = util.format(speechObject.text, zipcode);

                                debugLog(`SpeechOutput After saving user location: ${speechOutput}`);

                                debugLog(`handlerInput: ${handlerInput.responseBuilder
                                    .speak(speechOutput)
                                    .reprompt(repromtText)
                                    .withShouldEndSession(false)
                                    .getResponse()}`);

                            resolve(handlerInput.responseBuilder.speak(speechOutput)
                                .reprompt(repromtText)
                                .withShouldEndSession(false)
                                .getResponse());
                            })
                            .catch((error) => {
                                console.log(`Error in SetDefaultLocationIntent promise: ${error}`);
                                reject(error);
                            });
                    });

                }
            });
        }

      },
  };

終於解決了問題: 這只是我未正確處理的諾言問題 ,我不得不將一切都包裹在else語句中,這就是我如何重組最后的else語句以獲得所需的結果。

else {
            return new Promise((resolve, reject) => {
                let params = '';
                let lookupFunc = '';
                let placeNameLookup = '';
                if (zipcode.length > 0 && zipCodeValidator(zipcode)) {
                    params = zipcode;
                    lookupFunc = apiCalls.zipcodeLookup;
                }else {
                    if (state.length === 0) {
                        params = city;
                        placeNameLookup = city;
                    }else{
                        params = `${city}+${state}`;
                        placeNameLookup = `${city} ${state}`;
                    }
                    lookupFunc = apiCalls.placeNameLookup;
                }

                    lookupFunc (params,  (error, result, duration) => {

                        if(error || result === null) {
                            // API Call failed or result is null 
                            speechOutput = speech.getSpeechText('error2', false);
                            repromtText = speech.getSpeechText('reprompt3', false);

                             resolove(handlerInput.responseBuilder
                                .speak(speechOutput)
                                .reprompt(repromtText)
                                .withSimpleCard(cardTitle, speechOutput)
                                .withShouldEndSession(false)
                                .getResponse());
                        }else if (Object.keys(result).length === 0) {
                            // Returned an empty result
                            if (zipcode.length > 0) {
                                // was zipcode 
                                let speechObject = speech.getSpeechObject('setdefaultloc4');
                                repromtText = speech.getSpeechText('reprompt3', false);


                                speechOutput = util.format(speechObject.text, zipcode);

                            }else{
                                // wasn't zipcode
                                let speechObject = speech.getSpeechObject('setdefaultloc3');

                                repromtText = speech.getSpeechText('reprompt3', false);

                                speechOutput = util.format(speechObject.text, zipcode);

                            }
                            resolve(handlerInput.responseBuilder
                                .speak(speechOutput)
                                .reprompt(repromtText)
                                .withSimpleCard(cardTitle, speechOutput)
                                .withShouldEndSession(false)
                                .getResponse());
                        }else {
                            // Api Call successfull with result objects length > 0
                                handlerInput.attributesManager.getPersistentAttributes()
                                    .then((attributes) => {
                                        const defaultLoc = {
                                            name: result.name,
                                            lat: result.lat,
                                            lon: result.lon
                                        };
                                        const userId = handlerInput.requestEnvelope.context.System.user.userId;
                                        attributes['defaultLoc'] = defaultLoc;

                                        debugLog("Writing attributes to DynamoDB: " + userId + ", " + "defaultlocation: " + JSON.stringify(defaultLoc));
                                        handlerInput.attributesManager.setSessionAttributes(attributes);
                                        handlerInput.attributesManager.setPersistentAttributes(attributes);
                                        handlerInput.attributesManager.savePersistentAttributes();

                                        let speechObject = speech.getSpeechObject('setdefaultloc22');
                                        repromtText = speech.getSpeechText('reprompt3', false);

                                        speechOutput = util.format(speechObject.text, zipcode);

                                        debugLog(`SpeechOutput After saving user location: ${speechOutput}`);

                                        debugLog(`handlerInput: ${handlerInput.responseBuilder}`);

                                        resolve(handlerInput.responseBuilder.speak(speechOutput)
                                            .reprompt(repromtText)
                                            .withShouldEndSession(false)
                                            .getResponse());
                                    })
                                    .catch((error) => {
                                        console.log(`Error in SetDefaultLocationIntent promise: ${error}`);
                                        reject(error);
                                    });

                        }
                    });

            });        
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM