2017-01-30 8 views
0

NodeJS와 HapiJS 위에 API를 만들었습니다.NodeJS 앱에서 오류를 일으키는 MySQL 쿼리를 어떻게 찾을 수 있습니까?

앱이 시작할 때 많은 데이터를로드 한 다음 메모리에 보관합니다. 이 앱은 16 기가의 RAM을 가진 서버에서 실행되므로 메모리에 4 기가의 RAM을 보유 할 수 있어야합니다. 이 유일한 오류이며, 5 번 할 때마다 응용 프로그램 시작을 발생

{ Error: connect ETIMEDOUT 
    at Connection._handleConnectTimeout (/home/ec2-user/daemons/liar_lies/node_modules/mysql/lib/Connection.js:425:13) 
    at Socket.g (events.js:291:16) 
    at emitNone (events.js:86:13) 
    at Socket.emit (events.js:185:7) 
    at Socket._onTimeout (net.js:339:8) 
    at ontimeout (timers.js:365:14) 
    at tryOnTimeout (timers.js:237:5) 
    at Timer.listOnTimeout (timers.js:207:5) 
    -------------------- 
    at Protocol._enqueue (/home/ec2-user/daemons/liar_lies/node_modules/mysql/lib/protocol/Protocol.js:141:48) 
    at Protocol.handshake (/home/ec2-user/daemons/liar_lies/node_modules/mysql/lib/protocol/Protocol.js:52:41) 
    at Connection.connect (/home/ec2-user/daemons/liar_lies/node_modules/mysql/lib/Connection.js:136:18) 
    at /home/ec2-user/daemons/liar_lies/node_modules/knex/lib/dialects/mysql/index.js:106:18 
    at Promise._execute (/home/ec2-user/daemons/liar_lies/node_modules/bluebird/js/release/debuggability.js:300:9) 
    at Promise._resolveFromExecutor (/home/ec2-user/daemons/liar_lies/node_modules/bluebird/js/release/promise.js:481:18) 
    at new Promise (/home/ec2-user/daemons/liar_lies/node_modules/bluebird/js/release/promise.js:77:14) 
    at Client_MySQL.acquireRawConnection (/home/ec2-user/daemons/liar_lies/node_modules/knex/lib/dialects/mysql/index.js:104:12) 
    at Object.create (/home/ec2-user/daemons/liar_lies/node_modules/knex/lib/client.js:231:16) 
    at Pool._createResource (/home/ec2-user/daemons/liar_lies/node_modules/generic-pool/lib/generic-pool.js:326:17) 
    at Pool.dispense [as _dispense] (/home/ec2-user/daemons/liar_lies/node_modules/generic-pool/lib/generic-pool.js:314:12) 
    at Pool.acquire (/home/ec2-user/daemons/liar_lies/node_modules/generic-pool/lib/generic-pool.js:392:8) 
    at /home/ec2-user/daemons/liar_lies/node_modules/knex/lib/client.js:281:19 
    at Promise._execute (/home/ec2-user/daemons/liar_lies/node_modules/bluebird/js/release/debuggability.js:300:9) 
    at Promise._resolveFromExecutor (/home/ec2-user/daemons/liar_lies/node_modules/bluebird/js/release/promise.js:481:18) 
    at new Promise (/home/ec2-user/daemons/liar_lies/node_modules/bluebird/js/release/promise.js:77:14) 
    errorno: 'ETIMEDOUT', 
    code: 'ETIMEDOUT', 
    syscall: 'connect', 
    fatal: true } 

:

그러나, 응용 프로그램이 시작할 때마다이 오류가 로그에 5 번 나타납니다.

아직까지는 앱에서 예상되는 대부분의 데이터를 얻는 것처럼 보이므로 어떤 쿼리가이 오류를 던지더라도 애매하게 여겨야합니다.

이 오류가 발생하는 쿼리는 어떻게 확인할 수 있습니까?

stacktrace는이 문제를 일으키는 코드를 언급하지 않습니다. (. 나는이 실망을 찾을 수)

이 내가 사용하고 모듈은 다음과 같습니다

"boom": "3.1.2", 
"code": "2.1.0", 
"fs": "0.0.2", 
"glob": "6.0.4", 
"glue": "3.1.0", 
"good-console": "5.3.0", 
"good-file": "5.1.2", 
"hapi": "16.0.2", 
"html-entities": "1.2.0", 
"joi": "7.2.2", 
"knex": "0.12.6", 
"knex-logger": "0.1.0", 
"multiline": "1.0.2", 
"mysql": "2.12.0", 
"path": "0.12.7", 
"plugo": "0.3.1" 

내가 그 아는 단지 2 기능 시작시 데이터베이스를 호출이 있습니다. 이것은 그들 중 하나입니다

function build_maps_which_index_database_data(query, which_type_of_data_in_which_database_table) { 

    DB.knex.raw(query).then(
     function(result) { 
     var count_of_database_results = result[0].length; 
     build_list_of_allowed_fields(result[0][0]); 

     for(var how_many_records_processed_so_far = 0; how_many_records_processed_so_far < count_of_database_results; how_many_records_processed_so_far++) { 
      var document = result[0][how_many_records_processed_so_far]; 
      var profile_id = document['profile_id']; 
      document['which_type_of_data_in_which_database_table'] = which_type_of_data_in_which_database_table; 
      document['item_id'] = uuidV4(); 

      build_map_of_uuid_ids_to_documents(document); 

      Object.keys(document).forEach(function(name_of_field_in_database) { 
       // avoiding name_of_field_in_database = profile_id 
       if (name_of_field_in_database != 'profile_id') { 
        var string_from_database = document[name_of_field_in_database]; 
        build_map_of_santized_words_to_uuid_ids(name_of_field_in_database, string_from_database, document['item_id']); 
       } 
      }); 
     } 
     }) 
    .catch(function(e) { 
      console.log('Error:  calling code was get_map_of_santized_words_to_uuid_ids'); 
      console.log('query was: ' + query); 
     console.error(e);  
    }); 
} 

각 기능이 부착 된 "잡아"절을 가지고, 그래서 나는이 오류의 원인이라면, 그럼 내가 로그에 것을 볼 것입니다 가정합니다.

+2

[Sequelize] (http://sequelizejs.com)를 사용하면 하위 수준의 MySQL 드라이버를 사용하는 대신 오류를보다 잘 제어 할 수 있습니다. 당신은 그들을 붙잡고 근본 원인으로 되돌아 갈 수 있습니다. – tadman

+0

초기화 코드를 표시하면 추측 할 수 없습니다. – Paul

+0

Paul, 불분명하다면 죄송합니다.하지만 어떤 코드가 오류를 던지고 있는지는 내가 모르는 코드입니다. 필자가 작성한 초기화 코드는 오류없이 올바르게 실행되고로드 된 것으로 예상되는 데이터를로드합니다. 하지만 로그에는 앱을 시작할 때마다 5 개의 오류가 표시됩니다. 나는 그 오류의 원인에 대해 걱정하고 있습니다. 나는 그들을 추적하려고 노력하고있다. – LRK9

답변

1

질문에 포함 된 오류는 질문에 포함 된 코드로 인해 발생하지 않습니다.

오류가 발생했을 때 어떤 일이 일어나는지 알아 보려면 환경 변수 DEBUG=knex:*으로 앱을 실행하십시오. 그러면 연결 풀에서 어떤 일이 일어나고 어떤 쿼리가 DB로 보내지는지 알 수 있습니다.

export DEBUG=knex:* 
cd ~/yourapp 
node server.js 

하거나

cd ~/yourapp 
DEBUG=knex:* node server.js 

또한 당신은 여전히 ​​이러한 오류를 생성하는 응용 프로그램 코드의 최소한의 금액을 때까지 응용 프로그램에서 코드를 제거하려고합니다. 그 후에는 문제의 근본 원인을 찾는 것이 매우 쉬워야합니다.

당신이 할 수있는 한 가지 더이

knex.on('query-error', function (err, obj) { ... }); 

이벤트에 디버그 정보를 추가하고 그 오류를 잡는다 있는지 확인하는 것입니다.

+0

흠,이 오류가 발생합니다. DEBUG = knex : * ^ SyntaxError : 예기치 않은 토큰 : – LRK9

+0

@ LRK9는 셸의 환경 변수로 설정해야합니다. 답을 예제로 업데이트하겠습니다. –