在AWS上使用mysql-npm运行mysql查询

running a mysql query using mysql-npm on AWS

本文关键字:运行 mysql 查询 mysql-npm AWS      更新时间:2023-09-26

嗨,伙计们,我有一个问题,我真的不知道该怎么解决。这也有点奇怪:/基本上,我已经创建了这个Lambda函数,使用节点包"mysql"连接到mysql数据库。

如果我在电脑的命令行中使用命令"sls function run function1"运行该函数,并进行不同的查询,一切都很好。但是,当我使用链接从web浏览器调用该函数时,我必须刷新页面两次才能得到正确的结果,因为在第一次刷新时,服务器会用旧的结果进行响应。

我注意到,在命令行中,我总是有不同的thredID,而在Web浏览器中,thredID总是相同的。

此外,我不会关闭lambda函数代码中的连接,因为如果我从命令行运行函数,一切都很好,但从浏览器运行函数,我只能进行2次查询,然后我收到一条消息,说我不能使用关闭的连接。

因此,当我从web浏览器调用它时,它似乎存储了旧的查询结果。

很明显,我犯了同样愚蠢的错误,但我不知道如何解决。有人有主意吗?谢谢:)

'use strict';
//npm packages
var mysql=require('mysql');
var deasync = require('deasync');
//variables
var goNext=false; 			//use to synchronize deasync
var error=false;    		//it becomes TRUE if an error occured during the connection to the DB
var dataColumnTable;		//the data thet you extract from the query to the DB
var errorMessage;
//----------------------------------------------------------------------------------------------------------------
//always same credentials
var connection = mysql.createConnection({
				   	host     : 'hostAddress',
				  	user     : 'Puser',
				 	password : 'password',
				  	port     : '3306',
				  	database : 'database1',
		});
//----------------------------------------------------------------------------------------------------------------
module.exports.handler = function(event, context) {
var Email=event.email;
connection.query('SELECT City, Address FROM Person WHERE E_Mail=?', Email, function(err, rows) {
  
			if(err){
				console.log("Cannot connect to DB");
				console.log(err);
				error=true;
				errorMessage=err;
			}
			else{
				console.log("data from column acquired!");
				dataColumnTable=rows;
			}
			
			//connection.end(function(err) {
  			//							connection.destroy();			
			//});	
			//console.log("Connection closed!");
			goNext=true;
});
require('deasync').loopWhile(function(){return goNext!=true;});
//----------------------------------------------------------------------------------------------------------------
if(error==true)
	return callback('Error '+ errorMessage);
else	
	return callback(null,dataColumnTable); //return a JsonFile
	
//fine headler
};

免责声明:我不太熟悉AWS和/或AWS Lambda。

http://docs.aws.amazon.com/lambda/latest/dg/programming-model-v2.html状态(重点矿):

Lambda函数代码必须以无状态风格编写,并且与底层计算基础设施没有关联。您的代码应该期望本地文件系统访问、子进程和类似工件被限制在请求的生存期内。持久状态应该存储在AmazonS3、AmazonDynamoDB或其他云存储服务中。要求函数是无状态的,使AWS Lambda能够根据需要启动尽可能多的函数副本,以适应事件和请求的传入速率。从一个请求到另一个请求,这些函数可能并不总是在同一个计算实例上运行,并且您的Lambda函数的给定实例可能会被AWS Lambda多次使用

打开一个连接并将其存储在处理程序函数外部的变量中就是状态。连接可能会在请求之间关闭,甚至在您第一次请求之前关闭。您的lambda函数可能会被重用(因此线程ID相同)。

我的假设是(并试图解决这个问题),您需要在每个请求上创建连接(即,在您的处理程序中),并且可能不希望任何值像上次请求那样初始化。(可能除了常数)。