Изящное отключение с помощью nodemon и express - PullRequest
0 голосов
/ 02 марта 2020

Я пытаюсь перехватить сигнал, когда 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
...