我正在建立自定义技能。在添加谷歌分析之前,3个内置插件&从AWS控制台和服务模拟器进行测试时,2个海关意图都正常运行。现在,我得到的答案是无效的'来自服务模拟器,仅用于内置入口意图(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');
});
},
自定义意图中的示例 :( =>测试此意图将输出正确的speechOutput)
'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。我做错了什么?
最后一个参考,工作意图代码,在添加GA之前:
'AMAZON.CancelIntent': function () {
this.response.speak(STOP_MESSAGE);
this.emit(':responseReady');
},
答案 0 :(得分:1)
在没有工作的内置intent示例中,我需要做的就是用回调替换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());
},
答案 1 :(得分:0)
我不确定,因为我对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');
});
},
也许你离开一个范围,你不想离开......