У меня есть приложение Node.js, которое использует Express.js для прослушивания соединений. Код выглядит примерно так:
const express = require("express");
var server = express();
server.get("/test", (req, res) => testResponse(req, res));
server.listen(9001);
console.info("Server is listening to port 9001.");
Я хотел бы реализовать способ перезагрузки сервера без перезапуска всего приложения. Однако я не могу правильно закрыть сервер и освободить порт. Вот что я пробовал:
server.close();
console.info("Server closed. Restarting.");
var server = express();
server.get("/test", (req, res) => testResponse(req, res));
server.listen(9001);
console.info("Server is listening to port 9001.");
Как только я запускаю это, я получаю
Ошибка: прослушать EADDRINUSE: 9001
Каким будет правильный способ сделать это?
Приветствия.
server.close()
является асинхронным и выполняет обратный вызов. Попробуйте подождать, пока сервер не будет закрыт, прежде чем запускать новый:
server.close(()=>{
console.info("Server closed. Restarting.");
var server = express();
server.get("/test", (req, res) => testResponse(req, res));
server.listen(9001);
console.info("Server is listening to port 9001.");
});
Начиная с Express 3, метод app.close()
кажется, исчез, что означает, что у Экспресс-пользователей нет средств для изящной остановки приложения. Express действительно является слушателем событий http-запросов, что означает, что вы можете это сделать:
const express = require("express");
var server = express();
server.get("/test", (req, res) => testResponse(req, res));
var app = server.listen(9001, function () {
console.log('Listening :)');
app.close(function () {
console.info("Server closed. Restarting.");
var server = express();
server.get("/test", (req, res) => testResponse(req, res));
server.listen(9001);
console.info("Server is listening to port 9001.");
});
});;
console.info("Server is listening to port 9001.");
Более подробно об этом вы можете обратиться за упрочняющими узлами для производства
app.listen()
прежнему возвращает экземпляр узла http.Server
.
server.close()
для узла-сервера. для экспресс-приложения нет метода с именем close.