Я заметил что-то довольно своеобразное, когда я играл с ExpressJS.
Я пытаюсь закрыть все соединения db, если приложение закрывается. Но я заметил, что даже после закрытия приложения порт 8080 не выпускается. Мне пришлось бы вручную найти идентификатор процесса, удерживающего порт, и убить его.
Очевидно, что я либо не отказываюсь от соединения db, либо возникает какая-то утечка соединения. Но я не уверен, что на самом деле вызывает проблему.
Мой код - index.js
const express = require('express'),
app = express(),
db = require('./db'),
port = process.env.PORT || 8080;
// Commenting out this portion of the code makes the problem go away.
// But I would Like to keep it so I can close all open database connections
// before the application is closed
process.on('SIGINT',function(){
console.log('Closing database pool');
db.pool.end();
});
routes(app);
app.listen(port);
console.log('API Server started on localhost:${port}');
db.js
const config = require('./config'),
mysql = require('mysql');
exports.pool = mysql.createPool(config.mysql);
БД используется MySQL, размещенный на AWS RDS
Основные проблемы:
Порт не освобождается даже после закрытия приложения.
Есть ли утечка соединения и т.д.? Должен ли я делать что-то большее для более эффективного управления моими подключениями к базе данных?
Есть ли лучший способ обработать сценарий, когда приложение выходит из строя или иным образом закрывается и обрабатывает все открытые соединения и не работает безопасно?
Попробуй это
// assign result of listen()
const server = app.listen(port);
// then in your SIGINT handler do this
server.close()
server.close()
самом деле имеет обратный вызов, но не знает, как его ждать в обработчике. Вы также можете просто попробовать вместоserver.close
process.exit(0)
. Также может иметь значение порядок сdb.pool.end()
, точно не знаю, что там происходит. nodejs.org/api/http.html#http_server_close_callback