[230106] typescript + express + socket.io

뜨개발자·2023년 1월 6일
0

TIL

목록 보기
36/75

js로 구현하는 예제는 많은데 그대로 따라가려니 typescript 에러가 많이 떠서 생각보다 꽤 오래 헤맸다...

로컬 환경에서 테스트 완료한 기반 코드를 기록해둔다.

//app.ts

import * as express from 'express';
import * as cors from 'cors';
import helmet from 'helmet';
import * as compression from 'compression';
import { createServer } from 'http';
import morgan from './middlewares/morgan';
import router from './routes';
import errorHandler from './middlewares/errorHandler';
import logger from './config/logger';
import Socket from './socket';

class App {
  private app;

  private httpServer;

  constructor() {
    this.app = express();
    this.httpServer = createServer(this.app); //여기서 app에 http를 덧씌운다
    Socket(this.httpServer);
  }

  private setMiddlewares() {
    this.app.use(cors());
    this.app.use(helmet());
    this.app.use(compression());
    this.app.use(express.json());
    this.app.use(express.urlencoded({ extended: true }));
    this.app.use(morgan);
    this.app.use('/api', router);
    this.app.use(errorHandler);
  }

  public listen(port: number) {
    this.setMiddlewares();
    this.httpServer.listen(port, () => { //기존 app.listen에서 httpServer.listen으로 변경
      logger.info(`${port} 포트로 서버가 열렸습니다.`);
    });
  }
}

export default App;
//socket.ts

import * as http from 'http';
import { Server } from 'socket.io';
import './config/env';

const Socket = (server: http.Server) => {
  const io = new Server(server, {
    cors: {	//CORS 오류 방지
      origin: '*',
    },
  });

  io.on('connection', (socket) => {	//연결되면 실행
    console.log('New client connected');

    socket.on('disconnect', () => console.log('user disconnect', socket.id));	//연결이 해제되면 실행

    socket.on('new_chat', (data) => {	//new_chat이라는 이벤트를 받으면 실행
      io.emit('update', data);	//data를 담아 update 이벤트 실행
    });
  });
};

export default Socket;
profile
뜨개질하는 개발자

0개의 댓글