Alexa调用了Lambda函数来查询MySQL数据库循环
当我尝试运行下面的lambda函数时,我得到了添加到MySQL数据库中的适当值,但是,Alexa skill输出了一个错误,并且尝试从数据库中删除该值表明它会立即再次添加,直到我更改表名为止(然后我猜它会出错并最终停止) 当我从我的技能中调用任何Alexa意图时,我会触发MySQL位。我不太了解回调和Alexa上下文,所以我想我在处理它们时做了一些不正确的事情。似乎查询命令被调用了很多次,我不明白这一点,因为在每次回调“路由”结束时,我都有context.successed或context.fails,这将结束我的Lambda函数,并为Alexa提供它所需要的继续技能所需的输出 以下是我当前的代码:Alexa调用了Lambda函数来查询MySQL数据库循环,mysql,node.js,amazon-web-services,aws-lambda,alexa,Mysql,Node.js,Amazon Web Services,Aws Lambda,Alexa,当我尝试运行下面的lambda函数时,我得到了添加到MySQL数据库中的适当值,但是,Alexa skill输出了一个错误,并且尝试从数据库中删除该值表明它会立即再次添加,直到我更改表名为止(然后我猜它会出错并最终停止) 当我从我的技能中调用任何Alexa意图时,我会触发MySQL位。我不太了解回调和Alexa上下文,所以我想我在处理它们时做了一些不正确的事情。似乎查询命令被调用了很多次,我不明白这一点,因为在每次回调“路由”结束时,我都有context.successed或context.fa
var mysql = require('mysql');
var connection = mysql.createConnection({
host: '-',
user: '-',
password: '-',
database: '-'
});
exports.handler = (event, context) => {
try {
if (event.session.new) {
// New Session
console.log("NEW SESSION");
}
switch (event.request.type) {
case "LaunchRequest":
// Launch Request
console.log(`LAUNCH REQUEST`);
context.succeed(
generateResponse({},
buildSpeechletResponse("Welcome to an Alexa Skill, this is running on a deployed lamda function", true)
)
);
break;
case "IntentRequest":
// Intent Request
console.log(`Intent Request`);
console.log('Then run MySQL code:');
connection.connect(function(err) {
console.log('Inside connection.connect() callback');
if (!err) {
console.log("Database is connected ... ");
connection.query("INSERT INTO Users (user_id) VALUES ('TESTNAME')",
function(err2, result) {
console.log("Inside connection.query() callback");
if (!err2) {
console.log("Query Successful! Ending Connection.");
connection.end(function(err3) {
if (!err3) {
console.log("Connection ended!")
context.succeed(
generateResponse({},
buildSpeechletResponse("Welcome to the incredible intelligent MySQLable Alexa!", true)
)
);
} else {
console.log("Ending connection failure!");
context.fail("Ending connection failure! " + err3.message);
}
});
} else {
connection.end(function(err3) {
if (!err3) {
console.log("Query error! Ending Connection!");
context.fail(`Query error! Ending Connection!` + err2.message);
} else {
console.log("Query error and Error ending connection!" + err2.message + " " + err3.message);
context.fail("Query error and Error ending connection!" + err2.message + " " + err3.message);
}
});
}
});
} else {
console.log("Error connecting database3 ..." + err.message);
context.fail("Error connecting database3 ... " + err.message);
}
});
break;
case "SessionEndedRequest":
// Session Ended Request
console.log(`SESSION ENDED REQUEST`);
break;
default:
context.fail(`INVALID REQUEST TYPE: ${event.request.type}`);
}
} catch (error) {
context.fail(`Exception: ${error}`);
}
};
//Helpers
buildSpeechletResponse = (outputText, shouldEndSession) => {
return {
outputSpeech: {
type: "PlainText",
text: outputText
},
shouldEndSession: shouldEndSession
};
};
generateResponse = (sessionAttributes, speechletResponse) => {
return {
version: "1.0",
sessionAttributes: sessionAttributes,
response: speechletResponse
};
};
编辑:从CloudWatch添加此函数的最后两个执行日志(2,因为它们发生了不同的事情,尽管我没有更改代码):
日志1:
日志2:
START RequestId: 4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e Version: $LATEST
2017-03-10T21:12:44.518Z 4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e NEW SESSION
2017-03-10T21:12:44.519Z 4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e Intent Request
2017-03-10T21:12:44.519Z 4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e Then run MySQL code:
2017-03-10T21:12:44.756Z 4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e Inside connection.connect() callback
2017-03-10T21:12:44.756Z 4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e Database is connected ...
2017-03-10T21:12:44.799Z 4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e Inside connection.query() callback
2017-03-10T21:12:44.838Z 4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e Query error! Ending Connection!
2017-03-10T21:12:44.838Z 4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e
{
"errorMessage": "Query error! Ending Connection!ER_DUP_ENTRY: Duplicate entry 'TESTNAME' for key 'PRIMARY'"
}
END RequestId: 4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e
REPORT RequestId: 4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e Duration: 333.25 ms Billed Duration: 400 ms Memory Size: 128 MB Max Memory Used: 21 MB
START RequestId: ffd37e18-05d6-11e7-bdde-15cef47016ee Version: $LATEST
2017-03-10T21:17:43.197Z ffd37e18-05d6-11e7-bdde-15cef47016ee NEW SESSION
2017-03-10T21:17:43.197Z ffd37e18-05d6-11e7-bdde-15cef47016ee Intent Request
2017-03-10T21:17:43.197Z ffd37e18-05d6-11e7-bdde-15cef47016ee Then run MySQL code:
2017-03-10T21:17:43.197Z ffd37e18-05d6-11e7-bdde-15cef47016ee Inside connection.connect() callback
2017-03-10T21:17:43.197Z ffd37e18-05d6-11e7-bdde-15cef47016ee Error connecting database3 ...Cannot enqueue Handshake after invoking quit.
2017-03-10T21:17:43.198Z ffd37e18-05d6-11e7-bdde-15cef47016ee
{
"errorMessage": "Error connecting database3 ... Cannot enqueue Handshake after invoking quit."
}
END RequestId: ffd37e18-05d6-11e7-bdde-15cef47016ee
REPORT RequestId: ffd37e18-05d6-11e7-bdde-15cef47016ee Duration: 5.65 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 21 MB
查看该函数的cloudwatch日志。它是被多次调用,还是只被一次调用?日志告诉你什么?我添加了最后两个错误日志。显然,某些代码似乎正在>一次地运行。如果您确实想在处理程序内断开与数据库的连接,请在处理程序内移动
var connection=mysql.createConnection
。处理程序之外的变量可能(而不是——它们可能)从一个调用持续到下一个调用(请参阅“容器重用”),因此您试图重用已断开的连接。知道为什么第一次失败并触发循环行为吗?我已删除了关于重复RequestID的注释。我的眼球在那上面发火了。我只见过一次。
START RequestId: 4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e Version: $LATEST
2017-03-10T21:12:44.518Z 4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e NEW SESSION
2017-03-10T21:12:44.519Z 4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e Intent Request
2017-03-10T21:12:44.519Z 4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e Then run MySQL code:
2017-03-10T21:12:44.756Z 4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e Inside connection.connect() callback
2017-03-10T21:12:44.756Z 4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e Database is connected ...
2017-03-10T21:12:44.799Z 4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e Inside connection.query() callback
2017-03-10T21:12:44.838Z 4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e Query error! Ending Connection!
2017-03-10T21:12:44.838Z 4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e
{
"errorMessage": "Query error! Ending Connection!ER_DUP_ENTRY: Duplicate entry 'TESTNAME' for key 'PRIMARY'"
}
END RequestId: 4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e
REPORT RequestId: 4dba3aa0-05d6-11e7-85fc-d115fdc4ab9e Duration: 333.25 ms Billed Duration: 400 ms Memory Size: 128 MB Max Memory Used: 21 MB
START RequestId: ffd37e18-05d6-11e7-bdde-15cef47016ee Version: $LATEST
2017-03-10T21:17:43.197Z ffd37e18-05d6-11e7-bdde-15cef47016ee NEW SESSION
2017-03-10T21:17:43.197Z ffd37e18-05d6-11e7-bdde-15cef47016ee Intent Request
2017-03-10T21:17:43.197Z ffd37e18-05d6-11e7-bdde-15cef47016ee Then run MySQL code:
2017-03-10T21:17:43.197Z ffd37e18-05d6-11e7-bdde-15cef47016ee Inside connection.connect() callback
2017-03-10T21:17:43.197Z ffd37e18-05d6-11e7-bdde-15cef47016ee Error connecting database3 ...Cannot enqueue Handshake after invoking quit.
2017-03-10T21:17:43.198Z ffd37e18-05d6-11e7-bdde-15cef47016ee
{
"errorMessage": "Error connecting database3 ... Cannot enqueue Handshake after invoking quit."
}
END RequestId: ffd37e18-05d6-11e7-bdde-15cef47016ee
REPORT RequestId: ffd37e18-05d6-11e7-bdde-15cef47016ee Duration: 5.65 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 21 MB