从路由器内关闭服务器
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
获取您的服务器。
我创建了一个这样的 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
获取您的服务器。