我的Alexa技能有问题。代码是这样的:
var options = { method: 'GET',
url: 'http://98f8cd20.ngrok.io/products',
headers:
{ 'Postman-Token': 'f4e1b171-aae5-46d5-baeb-7903978cf10c',
'cache-control': 'no-cache',
'Content-Type': 'application/json' } };
const callExternalApi = (callback) => {
request(options, (error, response, body) => {
if (error) {
return callback(error)
}
const data = JSON.parse(body);
return callback(data)
})
} module.exports.callApi = callExternalApi
和
apicaller.callApi(function(antwort){
var test = antwort;
console.log(test)
})
当我在Sublime编辑器中对其进行测试时,根本没有问题,但是当我使用Alexa Skill对其进行测试时,我得到了一个错误。那里的代码如下:
'AllCarsIntent': function () {
apicaller.callApi(function(antwort){
var test = antwort.count;
this.response.speak(test).listen("Tell me what you think is the world's most popular sport.")
this.emit(':responseReady')
//.listen("Tell me what you think is the world's most popular sport.")
//this.emit(':responseReady')
});
我认为回调中的“ this”有问题。这是我的错误的样子:
START RequestId:4064b501-e1b2-11e8-b227-bb50cdd263c7版本:$ LATEST 2018-11-06T10:53:53.718Z 4064b501-e1b2-11e8-b227-bb50cdd263c7警告: 未设置应用程序ID 2018-11-06T10:53:54.118Z 4064b501-e1b2-11e8-b227-bb50cdd263c7 TypeError: 无法读取未定义的属性“响应” 在/var/task/index.js:29:12 在Request.request [作为_callback](/var/task/data.js:19:12) 在Request.self.callback(/var/task/node_modules/request/request.js:185:22) 在emitTwo(events.js:126:13) 在Request.emit(events.js:214:7) 应要求。 (/var/task/node_modules/request/request.js:1161:10) 在emitOne上(events.js:116:13) 在Request.emit(events.js:211:7) 在IncomingMessage。 (/var/task/node_modules/request/request.js:1083:12) 位于Object.onceWrapper(events.js:313:30)END RequestId:4064b501-e1b2-11e8-b227-bb50cdd263c7 REPORT RequestId: 4064b501-e1b2-11e8-b227-bb50cdd263c7持续时间:440.67 ms已计费 持续时间:500 ms内存大小:128 MB使用的最大内存:44 MB
RequestId:4064b501-e1b2-11e8-b227-bb50cdd263c7进程在退出之前 完成请求
任何人都知道我的错误是什么?我将衷心感谢您的帮助! 预先谢谢你!
答案 0 :(得分:0)
一旦在API调用函数中,上下文就会丢失。 this 不再引用外部上下文。在 callApi 函数外部定义变量 test ,然后在 calllApi 函数内部分配值,然后执行说话和 emit 也在 callApi 函数之外。您必须等待API调用的数据返回,因此您需要使用 async / await 和节点v8 + Here's是此类API调用的示例,但使用的是最新版本的ASK SDK(请迁移到此版本,不建议使用您使用的SDK)。