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);
});
}
각 기능이 부착 된 "잡아"절을 가지고, 그래서 나는이 오류의 원인이라면, 그럼 내가 로그에 것을 볼 것입니다 가정합니다.
[Sequelize] (http://sequelizejs.com)를 사용하면 하위 수준의 MySQL 드라이버를 사용하는 대신 오류를보다 잘 제어 할 수 있습니다. 당신은 그들을 붙잡고 근본 원인으로 되돌아 갈 수 있습니다. – tadman
초기화 코드를 표시하면 추측 할 수 없습니다. – Paul
Paul, 불분명하다면 죄송합니다.하지만 어떤 코드가 오류를 던지고 있는지는 내가 모르는 코드입니다. 필자가 작성한 초기화 코드는 오류없이 올바르게 실행되고로드 된 것으로 예상되는 데이터를로드합니다. 하지만 로그에는 앱을 시작할 때마다 5 개의 오류가 표시됩니다. 나는 그 오류의 원인에 대해 걱정하고 있습니다. 나는 그들을 추적하려고 노력하고있다. – LRK9