Как остановить сервер node.js, не убивая процесс?
Предположим, что сервер создан как:
var net = require('net');
var server = net.createServer();
server.listen(32323, '127.0.0.1');
server.close(); // gives a "not running" error if there is IP in the listen statement
есть способ остановить его от node.js, например. без завершения/уничтожения всего процесса?
Кроме того, здесь более сложный пример, который не останавливается независимо от IP-адреса, на который привязан сервер:
var net = require('net');
var server = net.createServer(function(socket) {
socket.on('data', console.log);
server.close();
});
server.listen(32323);
var socket = net.createConnection(32323);
socket.write('hi');
Ответы
Ответ 1
server.close
Не запускайте вызов перед тем, как срабатывает событие "listening"
.
Либо добавьте обратный вызов к listen
, либо добавьте событие вручную
server.listen(port, host, function () { server.close(); });
// OR
server.on("listening", function () { server.close(); });
server.listen(port, host);
var net = require('net');
var server = net.createServer(function(socket) {
socket.on('data', console.log);
server.close();
});
server.listen(32323);
var socket = net.createConnection(32323);
// call end to make sure the socket closes
socket.end('hi');
Ответ 2
Переход к второму, более реалистичному случаю: закрыть текущее соединение перед вызовом server.close
:
var net = require('net')
var server = net.createServer(function(socket){
socket.on('data', function(data){
console.log(data.toString())
socket.destroy()
server.close()
})
})
server.listen(32323)
Обратите внимание, что если у вас нет других экземпляров сервера или активности в этом процессе, он прекратит работу после закрытия server
.
Ответ 3
Если это HTTP или HTTPS-сервер, это помогает, если вы закроете сокет запроса со следующим:
function onRequest(request, response) {
response.end(); //close the response
request.connection.end(); //close the socket
request.connection.destroy; //close it really
server.close(); //close the server
}
server.on("request", onRequest);
server.on("close", function() {console.log("closed");});
server.listen(port, host);
Надеюсь, что это поможет.
Ответ 4
Вот пример, демонстрирующий, что я думаю, что вы после.
var net = require('net');
var server = net.createServer(function (socket) {
socket.on('data', function (data) {
console.log("server got data " + data.toString());
});
});
function startServer() {
server.listen(32323, function () {
console.log('server started');
});
}
function stopServer() {
server.close(function () {
console.log('server stopped');
});
}
setInterval(function () {
if (server.address()) {
console.log("Server is running on port " + server.address().port + " let kill it.");
stopServer();
} else {
console.log("Server is stopped let start it.");
startServer();
}
}, 10000);
setInterval(function () {
var socket = net.createConnection(32323, function () {
socket.write('hi');
});
socket.on('error', function (e) {
console.log(e.message);
});
}, 1000);
startServer();
Ответ 5
server.close() предотвращает новые подключения и ждет, пока все клиенты не будут закрыты.
Чтобы принудительно убить сервер node, вам нужно вызвать server.close(), а затем закрыть все открытые соединения с конца сервера.
Когда клиент подключается, отслеживайте сокет.
var sockets = []
var server = net.createServer((socket) => {
sockets.push(socket)
})
Чтобы принудительно убить...
server.close()
sockets.forEach( (s) => s.end() )