从路由器内关闭服务器

close server from within router

我创建了一个这样的 Express 应用程序

const express = require('express')
const app = express();

app.use(express.static(path.join(__dirname, 'public')));

app.post('/close', async (_, res) => {
  res.status(200);
  res.end();
  app.close();
});

module.exports = app;

我在另一个模块中实例化它

const myApp = require('./app.js');
myApp.listen(port, () => {
  console.log(`Started server on ${port}`);
});

我希望服务器在收到对 /close 的 post 请求时自行关闭。目前,我只收到 app.close is not a function 错误。

我知道我可以像这样从外部关闭服务器

const server = myApp.listen(port, () => {
  console.log(`Started server on ${port}`);
});
server.close();

但是我想在 post 请求 /close 时关闭服务器,我该怎么做?

您可以使用 http-terminator 包关闭您的服务器。以下应该可以解决问题。我们使用 http-terminator 的原因是如果通过路由访问服务器不会关闭。

const { createHttpTerminator } = require("http-terminator");
const { initApp, app } = require("./app.js");

const PORT = 3000;

const server = app.listen(PORT, () => {
  console.log(`Started server on ${PORT}`);
});

const httpTerminator = createHttpTerminator({ server });

initApp(httpTerminator);

模块内部:

const express = require("express");
const app = express();

const initApp = (httpTerminator) => {
  app.get("/close", async (_, res) => {
    res.json({ message: "we closed" });
    await httpTerminator.terminate();
  });
};

module.exports = { initApp, app };

要访问您的服务器对象,请尝试使用

req.connection.server

从您的路由处理程序中。

.close() makes the server stop listening 用于新连接。已经建立的连接不受影响。当所有打开的连接都断开时,服务器对象发出一个 'close' 事件。

process.exit() 停止你的整个 nodejs 应用程序。

因此,此代码可能会满足您的要求。

app.post('/close', (req, res, next) => {
  res.status(200)
  res.end()
  const server = req.connection.server
  if (server.listening) {
    server.addEventListener('close', ev => {
      console.log('server closed. See ya later alligator.')
      process.exit(0)
    })
    console.log('closing server')
    server.close()
  }
});

如果你需要从你的应用程序对象中获取服务器对象(如果从你的请求对象中获取它不够好),你可以像这样放入一个小的中间件函数。

app.use( function adornApp( req, res, next ) {
  req.app.locals.server = req.connection.server
  next()
} )

一旦您的中间件首次被调用,您就可以从 app.locals.server 获取您的服务器。