Express 服务器不退出进程并重新释放端口

Express server not exiting process and re-freeing port

我在节点应用程序中有一个快速服务器。我需要能够使用调试器 运行 这个节点应用程序。我还需要能够轻松地停止和重新启动服务器,而无需绑定 运行 所在的端口。我需要进入关机状态进行一些清理,我是这样做的:

const server = app.listen(port, () => {
    console.log("Listening on port whatever");
});

process.on('SIGINT', function () {
    server.close(() => {
        console.log(chalk.blue('Shutting down server'));
        // some cleanup code
        process.exit();
    });
});

我的启动脚本使用 nodemon 在保存时重新启动。以下是我的 package.json 的相关部分:

{
    "scripts": {
        "start:debug": "node --inspect -r tsconfig-paths/register -r ts-node/register ./src/server.ts",
        "start": "nodemon",
    },
    "nodemonConfig": {
        "ignore": [...],
        "watch": ["src"],
        "exec": "npm run start:debug",
        "ext": "ts"
    },
    "configurations": [
        {
            "type": "node",
            "request": "attach",
            "name": "Node: Nodemon",
            "processId": "${command:PickProcess}",
            "restart": true,
            "protocol": "inspector"
        }
    ]
}

这似乎有效。它正常启动,可通过节点调试器访问,并在使用 nodemon 保存时重新启动。当我点击 ctrl + c 时,服务器关闭并记录 "Shutting down server"。但是,即使在该 get 被记录之后,节点也会记录 Waiting for the debugger to disconnect...。当我再次点击 ctrl + c 并重新点击 运行 npm start 时,我收到一个崩溃提示 Error: listen EADDRINUSE: address already in use :::PORT#.

这里出了什么问题?我的服务器似乎正常关闭,但调试器似乎没有成功关闭,并且有一个节点进程仍在占用该端口。越来越难以干净地启动和停止我的服务器并调试问题。

要使调试器断开连接,您需要关闭其中包含调试器连接的 Chrome 选项卡。这将允许您的应用程序的前一个实例完全退出。