从NodeJS AWS Lambda函数查询MySQL数据库

我在使用AWS Lambda函数查询我的MySQL数据库(从AWS远程托pipe)时遇到问题。

这是我的代码,除了我需要的其余的Lambda函数(这被称为Alexa技能)的部分:

var mysql = require('mysql'); var connection = mysql.createConnection({ host : '<myserver>', user : '<myusername>', password : '<mypw>', database : '<mydatabase>' }); connection.connect(function(err){ if(!err) { console.log("Database is connected ... nn"); } else { console.log("Error connecting database ... nn"); } }); connection.query("INSERT INTO Users (user_id) VALUES ('TESTNAME')"); connection.end(); 

从我的命令提示符下使用节点运行它时,这工作得很好:

 node index.js 

我在index.js目录下使用通过npm安装的“mysql”模块并将其压缩并上传到我的Lambda函数中。

再次,这在我的开发机器上工作,但是在testing我的Lambda函数时没有提供任何指示符,为什么它根本不影响我的数据库。

我的问题扩展到Alexa和Lambda,就像正确使用mysql Node.JS模块一样。

这里是我的Lambda的当前代码,当然,这里的问题仍然是我的testing值 – >名为“TESTNAME”的用户名不会被添加到我的MySQL数据库中。

我把查询放到连接callback中,正如第一条评论所build议的那样,我把我的新代码放在上面,而不是更新旧的代码,只是为了logging代码应该如何转换到我的Alexa的Lambda函数:

更新的代码:

 var mysql = require('mysql'); var connection = mysql.createConnection({ host : '<myserver>', user : '<myusername>', password : '<mypw>', database : '<mydatabase>' }); 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(err, result) { console.log("Inside connection.query() callback") if (!err) { console.log("Query Successful! Ending Connectection."); connection.end(); } else { console.log("Query error!"); } }); } else { console.log("Error connecting database ..." + err.message); } }); context.succeed( generateResponse({}, buildSpeechletResponse("Welcome to the incredible intelligent MySQLable Alexa!", true) ) ); 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(`Exceptiodn: ${error}`) } }; //Helpers buildSpeechletResponse = (outputText, shouldEndSession) => { return { outputSpeech: { type: "PlainText", text: outputText }, shouldEndSession: shouldEndSession }; }; generateResponse = (sessionAttributes, speechletResponse) => { return { version: "1.0", sessionAttributes: sessionAttributes, response: speechletResponse }; }; 

和我的控制台输出:

 START RequestId: 5d4d17a7-0272-11e7-951c-b3d6944457e1 Version: $LATEST 2017-03-06T13:39:47.561Z 5d4d17a7-0272-11e7-951c-b3d6944457e1 Intent Request 2017-03-06T13:39:47.562Z 5d4d17a7-0272-11e7-951c-b3d6944457e1 Then run MySQL code: END RequestId: 5d4d17a7-0272-11e7-951c-b3d6944457e1 REPORT RequestId: 5d4d17a7-0272-11e7-951c-b3d6944457e1 Duration: 82.48 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 14 MB 

问题是我需要把我的context.succeed放在我的callback中。 非常感谢sqlbot,因为他对callback的讨论导致我研究事情实际上结束了执行。

所以显然,当使用AWS Lambda时,如果“上下文”在您的callback被调用之前结束,则不会得到callback。 所以,即使我已经把所有的callback都放在了这样的位置:connect – > query – > end,连接的第一个callback函数从不会被调用,因为之后会调用“context.succeed”,从而结束执行。

这里是我现在的代码(现在得到一个正确的查询):

 var mysql = require('mysql'); var connection = mysql.createConnection({ ... }); 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(err, result) { console.log("Inside connection.query() callback") if (!err) { console.log("Query Successful! Ending Connection."); connection.end(); } else { console.log("Query error!"); } }); } else { console.log("Error connecting database ..." + err.message); } context.succeed( generateResponse({}, buildSpeechletResponse("Welcome to the incredible intelligent MySQLable Alexa!", true) ) ); }); 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(`Exceptiodn: ${error}`) } }; //Helpers buildSpeechletResponse = (outputText, shouldEndSession) => { return { outputSpeech: { type: "PlainText", text: outputText }, shouldEndSession: shouldEndSession }; }; generateResponse = (sessionAttributes, speechletResponse) => { return { version: "1.0", sessionAttributes: sessionAttributes, response: speechletResponse }; };