2016-07-26 5 views
0

안녕하세요 여러분, 제가 해결 방법을 모르는 문제가 있습니다. 조금 이상하다./ 기본적으로 나는이 람다 함수를 만들어서 'mysql'노드 패키지를 사용하여 mysql DB에 연결했다.AWS에서 mysql-npm을 사용하여 mysql 쿼리를 실행

'sls function function1'명령을 사용하여 내 PC에서 명령 줄에서 함수를 실행하고 다른 쿼리를 모두 작성하면 문제가 없습니다. 그러나 링크를 사용하여 웹 브라우저에서 함수를 호출하면 서버를 처음 새로 고칠 때 이전 결과로 응답하기 때문에 올바른 결과를 얻으려면 2 번 새로 고쳐야합니다.

커맨드 라인에서 항상 나는 다른 thredID를 가지고있는 반면 webbrowser는 항상 동일하다는 것을 알았습니다.

또한 람다 함수 코드에서 연결을 닫지 않습니다. 왜냐하면 명령 줄에서 함수를 실행하면 브라우저가 두 가지 쿼리 만 만들 수 있습니다. 그런 다음 사용할 수 없다는 메시지가 나타납니다. 닫힌 연결.

그래서 람다가 웹 브라우저에서 전화를 걸면 이전 쿼리 결과를 저장하는 것처럼 보입니다.

분명히 나는 ​​어리석은 실수를 저지르고 있지만 어떻게 해결해야할지 모르겠다. 누구나 아이디어가 있습니까? 감사합니다 :)

'use strict'; 
 
//npm packages 
 
var mysql=require('mysql'); 
 
var deasync = require('deasync'); 
 

 
//variables 
 
var goNext=false; \t \t \t //use to synchronize deasync 
 
var error=false;  \t \t //it becomes TRUE if an error occured during the connection to the DB 
 
var dataColumnTable; \t \t //the data thet you extract from the query to the DB 
 
var errorMessage; 
 

 
//---------------------------------------------------------------------------------------------------------------- 
 

 
//always same credentials 
 
var connection = mysql.createConnection({ 
 
\t \t \t \t  \t host  : 'hostAddress', 
 
\t \t \t \t \t user  : 'Puser', 
 
\t \t \t \t \t password : 'password', 
 
\t \t \t \t \t port  : '3306', 
 
\t \t \t \t \t database : 'database1', 
 
\t \t }); 
 

 
//---------------------------------------------------------------------------------------------------------------- 
 

 
module.exports.handler = function(event, context) { 
 

 
var Email=event.email; 
 

 

 
connection.query('SELECT City, Address FROM Person WHERE E_Mail=?', Email, function(err, rows) { 
 
    
 
\t \t \t if(err){ 
 
\t \t \t \t console.log("Cannot connect to DB"); 
 
\t \t \t \t console.log(err); 
 
\t \t \t \t error=true; 
 
\t \t \t \t errorMessage=err; 
 
\t \t \t } 
 
\t \t \t else{ 
 
\t \t \t \t console.log("data from column acquired!"); 
 
\t \t \t \t dataColumnTable=rows; 
 
\t \t \t } 
 
\t \t \t 
 
\t \t \t //connection.end(function(err) { 
 
    \t \t \t // \t \t \t \t \t \t \t connection.destroy(); \t \t \t 
 
\t \t \t //}); \t 
 
\t \t \t //console.log("Connection closed!"); 
 
\t \t \t goNext=true; 
 
}); 
 

 
require('deasync').loopWhile(function(){return goNext!=true;}); 
 

 
//---------------------------------------------------------------------------------------------------------------- 
 

 

 
if(error==true) 
 
\t return callback('Error '+ errorMessage); 
 
else \t 
 
\t return callback(null,dataColumnTable); //return a JsonFile 
 
\t 
 
//fine headler 
 
};

+0

이 문제는 웹 브라우저가 결과를 캐싱하기 때문에 발생하는 람다와 관련이 없습니다. 브라우저 캐시를 다이얼링하여 시도하십시오. – error2007s

+0

@ error2007s 감사합니다.이 솔루션을 사용해 보겠습니다. – Jacob

답변

0

부인 성명 : 아니에요 AWS 및/또는 AWS 람다을 잘 알고 매우.

http://docs.aws.amazon.com/lambda/latest/dg/programming-model-v2.html 상태 (강조 광산) :

귀하의 람다 함수 코드는 상태가없는 스타일로 작성하고, 기본 컴퓨팅 인프라와의 친 화성이되어야합니다. 코드에서는 로컬 파일 시스템 액세스, 하위 프로세스 및 유사한 아티팩트가 요청의 수명으로 제한된 으로 제한됩니다. 영구 상태는 Amazon S3, Amazon DynamoDB 또는 다른 클라우드 스토리지 서비스에 저장되어야합니다. 함수에 상태 비 저장을 요구하면 AWS Lambda는 들어오는 이벤트 및 요청 비율을 확장하는 데 필요한만큼의 함수 복사본을 실행할 수 있습니다. 이 함수는 요청에서 요청까지 동일한 계산 인스턴스에서 항상 실행되는 것은 아니며, 람다 함수의 주어진 인스턴스 은 AWS Lambda가 번 이상 사용할 수 있습니다.

연결을 열고 처리기 함수 외부의 변수에 저장하면 상태입니다. 연결 요청은 요청간에 또는 첫 요청 전이라도 닫힐 ​​수 있습니다. 람다 함수는 재사용 될 수 있습니다 (따라서 동일한 스레드 ID).

모든 가정 (즉, 처리기 내부)에서 연결을 만들어야하며, 초기화 된 값이나 마지막 요청시와 같은 값을 기대할 수 없다는 가정하에이 문제를 해결하려고합니다. (아마 상수를 제외하고).

+0

나는 당신의 해결책을 시도하고 그것은 작동합니다! 도움을 주셔서 감사합니다. 솔루션을 찾으려면 미쳐 가고있었습니다. 매우 도움이되었습니다. – Jacob

+0

그러면 답변을 내 게시물에 표시 하시겠습니까? ;영형) – Jakumi

관련 문제