ОШИБКА: INVALID_RESPONSE - данные возвращаются с обещания, но не удается заставить Алекса говорить / показывать карту - PullRequest
0 голосов
/ 24 мая 2019

У меня есть два запроса https в nodejs, первый для подтверждения того, что пользователь авторизован для доступа к данным, а второй - для возврата данных.

У меня есть консольные журналы, и я вижу, что данныеуспешно возвращается в обещании, но Алекса не будет говорить / показывать карту.В cloudwatch нет ошибок.

Я не совсем понимаю синтаксис обещания, поэтому я уверен, что упускаю что-то простое.

Я изменил синтаксис, пытаясьasync / await, и, похоже, ничего не работает.

EDITED CODE - с некоторой помощью я смог лучше выложить свой код.Теперь я получаю сообщение об ошибке в облаке: ОШИБКА: INVALID_RESPONSE, Возникла исключительная ситуация при отправке запроса к навыку.

Примечание: эта ошибка происходит, потому что сейчас я ФОРСИРУЮошибка, ака верхняя часть (если redacted.errors).

messages.NO_ACCESS в настоящее время установлено на ---- "Хм, похоже, что у вас нет доступа к этим данным."

const IntentRequest = {
    canHandle(handlerInput) {
        return handlerInput.requestEnvelope.request.type === 'IntentRequest';
    },
    handle(handlerInput) {
        const { requestEnvelope, serviceClientFactory, responseBuilder } = handlerInput;
        let resp, resultData;

    return new Promise((resolve, reject) => {
         checkAuthenticationStatus(handlerInput, function(json){

            if(REDACTED.errors) {
                console.log('unauthed', REDACTED.error)
                reject(handlerInput.responseBuilder.speak(messages.NO_ACCESS).withSimpleCard('Unauthorized Request', messages.NO_ACCESS).getResponse());

            } else if(REDACTED.noerror && REDACTED.noerror.data == 'true'){
                const url = new URL(REDACTED.url);

               const resp = httpsGetIntent(handlerInput, url, (theResult) => {
                    resultData = theResult;
                    console.log('resolved with ---->', d)
                    return resolve(handlerInput.responseBuilder.speak("The result was" + d).withSimpleCard('Hello World', d).getResponse());
                })

            }

        })

        });

    },
};

Вот часть кода, гдеданные IS (resultData и d - это одно и то же и оба возвращают данные) возвращены, но она не говорит / не показывает карточку:

const IntentRequest = {
    canHandle(handlerInput) {
        return handlerInput.requestEnvelope.request.type === 'IntentRequest';
    },
     handle(handlerInput) {
        const { requestEnvelope, serviceClientFactory, responseBuilder } = handlerInput;
        let resp, resultData;
        return new Promise((resolve, reject) => {
            checkAuthenticationStatus(handlerInput, function(json){
                if(REDACTED) {
                reject(handlerInput.responseBuilder.speak(messages.NO_ACCESS).withSimpleCard('Unauthorized Request', messages.NO_ACCESS).getResponse())

            } else if(REDACTED && REDACTED == 'true'){
                const url = new URL(REDACTED);

                resp = httpsGetIntent(handlerInput, url, (theResult) => {
                    resultData = theResult;
                    console.log(resultData)
                }).then((d) => { 
                    console.log(d)
                    resolve(handlerInput.responseBuilder.speak("The result was" + d.response.outputSpeech.text).withSimpleCard('Hello World', d.response.outputSpeech.text).getResponse());
                }).catch((err) => { console.log(err)});

            }

        });

        });

    },
};

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

Есть несколько вещей, которые вы должны рассмотреть, и неясны в этом вопросе.

Что здесь УДАЛЕНО, откуда берется это значение?Вы нигде не упоминали об этом.

Давайте для удобства предположим, что это глобальная переменная.

Если REDACTED имеет значение false по любой причине, ваш код никогда не будет выполнен.Потому что условие никогда не выполняется.Так что это обещание не отвергает и не разрешает.

Если я предполагаю, что вы ошибочно написали УДАЛЕНО в первом операторе if, оно должно быть! УДАЛЕНО, вероятно.

 resp = httpsGetIntent(handlerInput, url, theResult => {
              resultData = theResult;
              console.log(resultData);
            })
            .then(d => {
              console.log(d);
              resolve(
                handlerInput.responseBuilder
                .speak("The result was" + d.response.outputSpeech.text)
                .withSimpleCard("Hello World", d.response.outputSpeech.text)
                .getResponse()
              );
            })
            .catch(err => {
              console.log(err);
            });

Здесь httpsGetIntent также не правильно, у вас есть метод обратного вызова, который получает theResult и все же присоединяет метод then, который не имеет никакого смысла.Более того, resultData здесь ничего не делает.

Предполагая, что checkAuthenticationStatus и httpGetIntent имеют шаблон обратного вызова, вы можете написать что-то вроде этого

const IntentRequest = {
  canHandle(handlerInput) {
    return handlerInput.requestEnvelope.request.type === "IntentRequest";
  },
  handle(handlerInput) {
    const {
      requestEnvelope,
      serviceClientFactory,
      responseBuilder
    } = handlerInput;
    let resp, resultData;
    return new Promise((resolve, reject) => {

      checkAuthenticationStatus(handlerInput, function (json) {
        if (!REDACTED) {
          reject(
            handlerInput.responseBuilder
            .speak(messages.NO_ACCESS)
            .withSimpleCard("Unauthorized Request", messages.NO_ACCESS)
            .getResponse()
          );
        } else if (REDACTED && REDACTED == "true") {
          const url = new URL(REDACTED);

          httpsGetIntent(handlerInput, url, theResult => {
            resultData = theResult;
            console.log(resultData);
           return resolve(
              handlerInput.responseBuilder
              .speak("The result was" + d.response.outputSpeech.text)
              .withSimpleCard("Hello World", d.response.outputSpeech.text)
              .getResponse()
            );
          })
        }
      });
    });
  }
};
0 голосов
/ 24 мая 2019

В обозначении стрелки .then((d) => resolve(x)) вернет разрешение, потому что вызов разрешения находится на той же строке, но если вы .then(() => { // more than one line }), я думаю, вам просто нужно явно вызвать return.

const IntentRequest = {
  canHandle(handlerInput) {
    return handlerInput.requestEnvelope.request.type === 'IntentRequest';
  },
  handle(handlerInput) {
    const { requestEnvelope, serviceClientFactory, responseBuilder } = handlerInput;
    // do you need resp here?
    let resp, resultData;
    return new Promise((resolve, reject) => {
      checkAuthenticationStatus(handlerInput, function(json){
        // does REDACTED know about json?
        if(!REDACTED) {
          reject(handlerInput.responseBuilder
            .speak(messages.NO_ACCESS)
            .withSimpleCard('Unauthorized Request', messages.NO_ACCESS)
            .getResponse());
        } else if(REDACTED && REDACTED == 'true') {
          const url = new URL(REDACTED);
          httpsGetIntent(handlerInput, url, (resultData) => {
            console.log(resultData);
            return resultData;
          }).then((d) => {
            resolve(handlerInput.responseBuilder
              .speak("The result was" + d.response.outputSpeech.text)
              .withSimpleCard("Hello World", d.response.outputSpeech.text)
              .getResponse());
          }).catch((err) => { console.log(err)});
        }
      });
    });
  }
},
...