Alexa Skill не отвечает после запроса Ajax - PullRequest
0 голосов
/ 03 мая 2018

Этот код отлично работает

var app = new Alexa.app('appName');
// ...
app.intent('marcopolo', {
  'slots': {},
  'utterances': ['marco']
}, function(request, response){
  console.log('marco worked');
  response.say('polo').shouldEndSession(false).send();
});

// Alexa says: polo
// Log says: marco worked

Этот код не работает

var app = new Alexa.app('appName');
// ...
app.intent('marcopolo', {
  'slots': {},
  'utterances': ['marco']
}, function(request, response){
  console.log('marco started');
  return ajax('http://www.google.com')
    .then(function(){
      console.log('marco response');
      response.say('polo').shouldEndSession(false).send();
    })
    .catch(function(){
      console.log('marco error');
      response.say('polo, I think').shouldEndSession(false).send();
    });
});

// alexa says: (no response)
// Log says: marco started

Я попытался использовать оба request-обещание и суперагент в качестве библиотеки Ajax с тем же результатом.

Вот версии:

"alexa-app": "^2.4.0",
"request-promise": "^2.0.0",
"superagent": "^3.8.3"

Вот мое намерение в навыке Алексы:

"intents": [
  {
    "name": "marcopolo",
    "slots": [],
    "samples": [ "marco" ]
  }
]

Я никогда не видел, чтобы app.intent() принимал оператор return, но где-то в Интернете я читал ответ, в котором говорилось, что для асинхронного ответа внутри app.intent() требуется возврат обещания, но это обновление не имело никакого эффекта:

return ajax('http://www.google.com')

Я также подумал, что, возможно, это было медленно и истекло время ожидания, но у моего Alexa Skill Timeout установлено 5 минут. У меня есть другие навыки, которые делают Ajax без проблем, и весь код работает на Lambda (облачный сервис), поэтому я не могу представить, что что-то окружающее может вызвать проблему.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 03 мая 2018

Этот код работает

var ajax = require('request-promise');
//...
app.intent('marcopolo', {
  'slots': {},
  'utterances': ['marco']
}, function(req, res){

  ajax('http://google.com').then(function() {
    console.log('success');
    res.say('polo').send();
  }).catch(function(err) {
    console.log(err.statusCode);
    res.say('not working').send();
  });
  return false;

});

Как оказалось, требуется оператор return, и он должен быть false. Я не смог найти ни одного места, где это задокументировано, ни объяснения того, что return false означает для app.intent(). Возвращая undefined или объект Promise прерывает взаимодействие.

...