从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 }; };
- 如何为Node.js WebSocket服务器configurationAWS Elastic Beanstalk?
- 更新Elastic Beanstalk中的Nodejs版本
- 在amazon ec2实例中处理I / O请求
- 亚马逊S3和节点jsvideostream和缩略图?
- 将AWS Lambda连接到Redshift – 在60秒后超时
- AWS API网关:由于configuration错误而导致执行失败:响应中的JSON无效
- Elastic Beanstalk CLI错误:此目录尚未使用EB CLI进行设置您必须首先运行“eb init”
- 在运行nodejs + expressjs时访问aws-lambda上下文
- Node.js AWS SDK请求不在一个文件中接收响应数据,而不是另一个