ExpressJS - порт не освобождается после закрытия приложения узла

0

Я заметил что-то довольно своеобразное, когда я играл с 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

Основные проблемы:

  1. Порт не освобождается даже после закрытия приложения.

  2. Есть ли утечка соединения и т.д.? Должен ли я делать что-то большее для более эффективного управления моими подключениями к базе данных?

  3. Есть ли лучший способ обработать сценарий, когда приложение выходит из строя или иным образом закрывается и обрабатывает все открытые соединения и не работает безопасно?

Теги:
express

1 ответ

1
Лучший ответ

Попробуй это

// assign result of listen()
const server = app.listen(port);

// then in your SIGINT handler do this
server.close()
  • 0
    Это сработало для меня. Спасибо! Но я также хотел бы знать, почему это работает и что я делаю неправильно. Не могли бы вы указать мне ресурсы, где я могу прочитать больше об этом, пожалуйста?
  • 1
    Если вы переписываете обработчик для SIGINT, я думаю, вам нужно позаботиться о том, чтобы отключить ваши соединения. server.close() самом деле имеет обратный вызов, но не знает, как его ждать в обработчике. Вы также можете просто попробовать вместо server.close process.exit(0) . Также может иметь значение порядок с db.pool.end() , точно не знаю, что там происходит. nodejs.org/api/http.html#http_server_close_callback

Ещё вопросы

Сообщество Overcoder
Наверх
Меню