我知道,这个话题经常被讨论。但是这些帖子要么很老,要么不能解决我的问题。所以我尝试打开一个新的(另一个)。我最近开始制作Alexa技能。因此,现在我借助(也是很旧的)教程成功设置了我的AWS Lambda函数。第一步一切正常。因此,现在我想向网站发送GET请求,只是为了获取状态码。下一步,Alexa应该告诉我这个代码-但这就是一个不同的故事。因此,我尝试使用许多不同的代码段来完成请求-但没有任何效果。阅读各种文章后,我了解代码运行得更快,然后可以执行请求。因此,请求的答案永远不会显示在日志中。这意味着,我无法利用它。
这是我当前的代码:
exports.handler = async (event, context, callback) => {
try {
console.log(event)
if (event.session.new) {
console.log("new session");
}
switch (event.request.type) {
case "LaunchRequest":
console.log("LAUNCH REQUEST");
context.succeed(
generateResponse(
buildSpeechletResponse("This is a launch request", true), {}
)
)
break;
case "IntentRequest":
console.log("INTENT REQUEST")
switch (event.request.intent.name) {
case "checkConnection":
console.log("INTENT CHECK CONNECTION")
const https = require('https')
let url = "xxx/xxx/bc/alexa"
exports.handler = async function(event) {
console.log("async function")
const promise = new Promise(function(resolve, reject) {
https.get(url, (res) => {
resolve(res.statusCode)
}).on('error', (e) => {
reject(Error(e))
})
})
return promise
}
context.succeed(null, generateResponse(
buildSpeechletResponse("server answered with code " + this.statusCode, true), {}));
break;
}
case ("SessionEndedRequest"):
console.log("SESSION ENEDED REQUEST")
break;
default:
context.fail(`INVALID REQUEST TYPE: ${event.request.type}`);
break;
}
}
catch (error) { context.fail(`Exception: ${error}`) }
}
// Helpers
buildSpeechletResponse = (outputText, shouldEndSession) => {
console.log("buildSpeechletResponse");
return {
outputSpeech: {
type: "PlainText",
text: outputText
},
shouldEndSession: shouldEndSession
}
};
generateResponse = (speechletResponse, sessionAttributes) => {
console.log("generateResponse")
return {
version: "1.0",
sessionAttributes: sessionAttributes,
response: speechletResponse
}
};
如果我通过lambda测试(包括来自Alexa的JSON来检查连接)来测试代码,则日志如下所示。
据我所知,该代码运行到“ INTENT CHECK CONNECTION”,但是日志“异步功能”从未显示。那么这里发生了什么?代码被跳过了吗?我如何设法获得有效的http请求状态? (对不起,如果我的帖子不是“普通方法”。这也是我的第一篇帖子)
所以我想通了。我提供的代码几乎是正确的。请求功能需要封装为另一个功能。稍作调整,便可以使用以下代码:
// HTTP Request Function
function httpGet(options) {
const https = require('https');
return new Promise(((resolve, reject) => {
const request = https.request(options, (response) => {
response.setEncoding('utf8');
let returnData = '';
if (response.statusCode < 200 || response.statusCode >= 300) {
return reject(new Error(`${response.statusCode}: ${response.req.getHeader('host')} ${response.req.path}`));
}
response.on('data', (chunk) => {
returnData += chunk;
});
response.on('end', () => {
resolve(response.statusCode); //Fill response with status code
});
response.on('error', (error) => {
reject(error);
});
});
request.end();
}));
}
In your code exports.handler = async function(event) {} is the cause
exports.handler始终在AWS lambda中处于输入功能中
我只是删除了此代码
exports.handler = async (event, context, callback) => {
try {
console.log(event)
if (event.session.new) {
console.log("new session");
}
switch (event.request.type) {
case "LaunchRequest":
console.log("LAUNCH REQUEST");
context.succeed(
generateResponse(
buildSpeechletResponse("This is a launch request", true), {}
)
)
break;
case "IntentRequest":
console.log("INTENT REQUEST")
switch (event.request.intent.name) {
case "checkConnection":
console.log("INTENT CHECK CONNECTION")
const https = require('https')
let url = "xxx/xxx/bc/alexa"
https.get(url, (res) => {
context.succeed(null, generateResponse(
buildSpeechletResponse("server answered with code " + res.statusCode, true), {}));
}).on('error', (e) => {
// handle error here
reject(Error(e))
})
})
break;
}
case ("SessionEndedRequest"):
console.log("SESSION ENEDED REQUEST")
break;
default:
context.fail(`INVALID REQUEST TYPE: ${event.request.type}`);
break;
}
}
catch (error) { context.fail(`Exception: ${error}`) }
}
// Helpers
buildSpeechletResponse = (outputText, shouldEndSession) => {
console.log("buildSpeechletResponse");
return {
outputSpeech: {
type: "PlainText",
text: outputText
},
shouldEndSession: shouldEndSession
}
};
generateResponse = (speechletResponse, sessionAttributes) => {
console.log("generateResponse")
return {
version: "1.0",
sessionAttributes: sessionAttributes,
response: speechletResponse
}
};