2017-01-30 4 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は、シェルの環境変数に設定する必要があります。答えを例で更新します。 –

関連する問題