Alexa - 添加 Google 分析后服务模拟器的内置意图出错

Alexa - Error with built-ins intents on service simulator after adding Google Analytics

我正在构建自定义技能。在添加 google 分析之前,从 AWS 控制台和服务模拟器进行测试时,3 个内置和 2 个自定义意图均正常工作。现在,我从服务模拟器中得到 'The response is invalid',仅针对内置意图(2 个海关意图给出了正确的 lambda 响应)。这是自上一个工作版本以来我的代码发生的变化:

添加:

var express = require('express'), request = require('request'), app = express(), GA_TRACKING_ID = 'UA_TRACKING_ID';

function trackEvent(category, action, label, value, cb) {
  console.log('1');
  var data = {v: '1', tid: GA_TRACKING_ID, cid: '555', t: 'event', ec: category, ea: action, el: label, ev: value,};
  request.post(
    'http://www.google-analytics.com/collect', {
      form: data
    },
    function(err, response) {
      console.log('2');
      if (err) { console.log('3'); return cb(err); }
      if (response.statusCode !== 200) {
        console.log('4');
        return cb(new Error('Tracking failed'));
      }
      console.log('5');
      cb();
    }
  );
}

并调用 trackEvent 函数,所有意图都类似:

内置意图示例:(=> 测试此意图在 CloudWatch 中注销“1”,然后执行停止)

'AMAZON.CancelIntent': function (intent, session, response) {
   var self = this;
   trackEvent('Intent', 'AMAZON.CancelIntent', 'stop', '100', function(err) {
     if (err) { return next(err); }
     self.response.speak(STOP_MESSAGE);
     self.emit(':responseReady');
   });
},

自定义意图示例:(=> 测试此意图将输出正确的语音输出)

'DressingTodayIntent': function(intent, session, response) {
  var speechOutput;
  var self = this;
  var cb = getJSON('...', function(err, forecast) {
    if (err) {
      console.log('Error occurred while trying to retrieve data', err);
    } else {
      speechOutput = getDressingAdvice(forecast, true);
    }
      self.response.cardRenderer("Your advice for today:", speechOutput);
      self.response.speak(speechOutput);
      self.emit(':responseReady');
  });
  trackEvent('Intent', 'DressingTodayIntent', 'DressingToday', '100', cb);
}

我坚持,'AMAZON.CancelIntent','AMAZON.HelpIntent','AMAZON.StopIntent'(&'LaunchRequest')都不行,只有因为我添加了遗传算法。我做错了什么?

添加 GA 之前的最后参考,工作意图代码:

'AMAZON.CancelIntent': function () {
  this.response.speak(STOP_MESSAGE);
  this.emit(':responseReady');
},

我不确定,因为我对 JS 不太熟悉。但是你试过使用箭头函数吗?可能是这样的..

'AMAZON.CancelIntent': function (intent, session, response) {
   // var self = this;
   trackEvent('Intent', 'AMAZON.CancelIntent', 'stop', '100', (err) => {
     if (err) { return next(err); }
     this.response.speak(STOP_MESSAGE);
     this.emit(':responseReady');
   });
},

也许你离开了一个你不想离开的范围...

在不起作用的内置意图示例中,我需要做的就是用回调替换 trackEvent 中的实际函数,如下所示:

'AMAZON.CancelIntent': function (intent, session, response) {
  var self = this;

  var callback = function(err) {
    if (err) { return next(err); }
    console.log(STOP_MESSAGE);
    self.response.speak(STOP_MESSAGE);
    self.emit(':responseReady');
  };
  trackEvent('Intent', 'AMAZON.CancelIntent', 'Cancel', '100', callback());
},