라우터 내에서 서버 닫기

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 };