javascript - 从路由器内关闭服务器

标签 javascript node.js express nodejs-server

我创建了一个这样的 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 的发布请求时自行关闭。目前,我只是得到一个 app.close is not a function 错误。

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

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

但是我想在对 /close 的发布请求中关闭服务器,我该怎么做?

最佳答案

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

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 获取您的服务器。

关于javascript - 从路由器内关闭服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64856622/

相关文章:

javascript - vscode Intellisense NodeJs

javascript - 如何在不重新渲染组件的情况下更改 useState 的状态,而只是它的组件

javascript - 通过 For 循环访问对象元素

node.js - MongoDB 不使用 NodeJS 驱动程序应用程序返回数据

javascript - Express.js : regex in route

javascript - 使用node或express返回json格式的正确方法

javascript - 为什么在 Firefox 或 Chrome 中重新加载页面会导致浏览器调用服务器后触发卸载事件处理程序?

javascript - 如何从另一个页面关闭模态表单

javascript - 如何为项目指定本地版本的 Node?

Javascript:按特定字段获取所有对象