我创建了一个这样的 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/