我一直在为 Amazon Echo 开发音频播放器。亚马逊提供了一个很好的例子来解决(https://github.com/alexa/alexa-skills-kit-sdk-for-nodejs)。我来自 Python,node.js 对我来说还是个新手,所以这是一个有趣的练习。
我有多个要根据用户的时区播放的流。由于 Amazon Echo 没有简单的方法来执行此操作,因此我决定提示用户输入他们的邮政编码并使用它来确定他们的时区。
最初尝试使用所有相关邮政编码/时区对的 JSON 文件,但加载时间过长。
尝试将它们加载到数据库中遇到了不同的结果,因为我在配置 Alexa 技能以使用多个数据库时遇到了麻烦。(我正在使用一个来跟踪用户会话。)
最终,我决定使用第三方 API 来确定位置 ( https://www.zipcodeapi.com/API#zipToLoc )。在节点 shell 中的测试进行得很顺利,所以我将它上传到我的 lambda 进行测试。
不幸的是,测试一直给我“无法读取未定义的属性'body'”。
违规代码
var constants = require(constants);
var request = require(request);
var zipcode = 85223; // Normally, this is taken from the intent.
var request_string = 'https://www.zipcodeapi.com/rest/' + constants.zipAPIKey + '/info.json/' + zipcode + '/degrees';
var bd = request(request_string, function(error, response, body){
return body;
});
var proc_body = JSON.parse(bd.response.body); // THE PROBLEM LINE
if (proc_body.hasOwnProperty('error_code')){
var message = 'An error occurred. Try again later.';
console.log("ZipCodeAPI Error : %j", proc_body.error_msg);
this.attributes['utc'] = -5; // Default to EST
} else {
this.attributes['utc'] = proc_body.timezone.utc_offset_sec / 3600; // utc_offset_sec is in seconds. Bump it back to hours.
var message = 'Your system has been configured.';
}
由 shell 提供:JSON.parse(bd.response.body)
{
zip_code: '85223',
lat: 32.740013,
lng: -111.679788,
city: 'Arizona City',
state: 'AZ',
timezone:
{ timezone_identifier: 'America/Phoenix',
timezone_abbr: 'MST',
utc_offset_sec: -25200,
is_dst: 'F' },
acceptable_city_names: []
}
正如我之前所说,它在 shell 中运行良好。我不确定为什么它在 lambda 中给我带来了问题。请求是异步的,并且 Echo 不等待 API 的回复吗?我没有正确配置一些东西吗?
感谢您提供的任何帮助。感谢您的时间。
编辑:根据下面的评论,我重新阅读了文档。我猜是因为我超出了范围?
'GetZip' : function () {
this.attributes['zipcode'] = this.event.request.intent.slots.zipcode.value;
var request_string = 'https://www.zipcodeapi.com/rest/' + constants.zipKey + '/info.json/' + this.attributes['zipcode'] + '/degrees';
request(request_string, function(error, response, body){
var proc_body = JSON.parse(body);
if (proc_body.hasOwnProperty('error_code')){
var message = 'An error occurred. Try again later.';
console.log("ZipCodeAPI Error : %j", proc_body.error_msg);
this.attributes['utc'] = -5;
} else {
this.attributes['utc'] = proc_body.timezone.utc_offset_sec / 3600;
var message = 'Your system has been configured.';
}
this.handler.state = constants.states.START_MODE;
this.response.speak(message);
controller.play.call(this);
});
我认为仍然存在范围问题,因为this
无法访问。