라우터 내에서 서버 닫기
Nov 16 2020
이런 익스프레스 앱을 만듭니다
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
기능 오류가 아닙니다.
이렇게 외부에서 서버를 닫을 수 있다는 것을 알고 있습니다.
const server = myApp.listen(port, () => {
console.log(`Started server on ${port}`);
});
server.close();
하지만에 대한 게시 요청에서 서버를 닫고 /close
싶습니다. 어떻게해야합니까?
답변
2 O.Jones Nov 16 2020 at 19:33
서버 개체에 액세스하려면 다음을 사용해보십시오.
req.connection.server
경로 핸들러 내에서.
.close()서버 가 새 연결 수신 을 중지 합니다. 이미 설정된 연결은 영향을받지 않습니다. 서버 개체는 '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()
}
});
앱 개체에서 서버 개체를 가져와야하는 경우 (req 개체에서 가져 오는 것으로 충분하지 않은 경우) 이와 같은 작은 미들웨어 함수를 넣을 수 있습니다.
app.use( function adornApp( req, res, next ) {
req.app.locals.server = req.connection.server
next()
} )
그런 다음 app.locals.server
미들웨어가 처음 호출되면 서버를 가져올 수 있습니다 .
Reyno Nov 16 2020 at 18:12
당신은 사용할 수 HTTP-터미네이터 서버를 종료 패키지를. 다음은 트릭을 수행해야합니다. 우리가를 사용하는 이유는 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 };