Я пытаюсь перехватить сигнал, когда nodemon перезапускает мой express сервер. Мне нужно это для того, чтобы закрыть базу данных, которая в противном случае выдает ошибку, когда я пытаюсь использовать его дальше. EDIT: сначала это не выглядело так, но вызывает некоторые функции, когда я завершаю его с помощью Ctrl + C. Я прокомментировал, какие из них.
Судя по всему, nodemon отправляет сигнал SIGUSR2 при перезапуске, но я попытался добавить к нему событие, а также бесчисленное количество других; Это отрывок файла nodemon, который запускается (главная точка входа приложения в файл с именем /bin/www
, это было по умолчанию при создании приложения express); как вы можете видеть, я попробовал несколько вещей:
var app = require("../app");
var debug = require("debug")("server:server");
var http = require("http");
// terminus was built to handle this, right?
const { createTerminus } = require("@godaddy/terminus");
app.set("port", "3001");
/**
* Create HTTP server.
*/
var server = http.createServer(app);
// the terminus handler for SIGUSR2
function onSignal() {
console.log("server is starting cleanup");
// start cleanup of resource, like databases or file descriptors
}
async function onHealthCheck() {
// checks if the system is healthy, like the db connection is live
// resolves, if health, rejects if not
return true;
}
createTerminus(server, {
signal: "SIGUSR2",
healthChecks: { "/healthcheck": onHealthCheck },
onSignal
});
/**
* Listen on provided port, on all network interfaces.
*/
server.listen(port);
server.on("error", onError);
server.on("listening", onListening);
server.on("close", () => {
// this is never called on nodemon restart, it is when ctrl+c is pressed
console.log("Server close");
});
/**
* Event listener for HTTP server "listening" event.
*/
function onListening() {
var addr = server.address();
var bind = typeof addr === "string" ? "pipe " + addr : "port " + addr.port;
debug("Listening on " + bind);
}
process.on("SIGTERM", function() {
// this is never called
console.log("SIGTERM");
server.close(function() {
process.exit(0);
});
});
process.on("SIGINT", function() {
// this is only called on ctrl+c, not restart
console.log("SIGINT");
server.close(function() {
process.exit(0);
});
});
process.on("SIGUSR2", function() {
// never called
console.log("SIGUSR2");
server.close(function() {
process.exit(0);
});
});
process.on("beforeExit", () => {
// nope, never called
console.log("before exit");
});
process.on("exit", () => {
// only called on ctrl+c, not on restart
console.log("exit");
});
Я уверен, что хотя бы одна из этих функций должна обрабатывать событие и позволять мне закрывать БД, но если я запускаю сервер через nodemon /bin/www
Я просто получаю вывод, связанный с запуском, если я затем перезагружаю сервер, набирая rs
, журнал вывода выглядит так:
Started directory watcher //normal startup
rs
[nodemon] starting `node ./bin/www` //none of the functions above is called