Node.js

2024년 5월 17일 Node.js-Socket(2)

황수환 2024. 5. 18. 02:07

1. connection/socket.js

import { Server } from 'socket.io';
import jwt from 'jsonwebtoken';
import { config } from '../config.js';

class Socket {
    constructor(server) {
        this.io = new Server(server, {
            cors: {
                origin: '*'
            }
        })
        this.io.use((socket, next) => {
            const token = socket.handshake.auth.token;
            if(!token){
                return next(new Error('인증 에러!'));
            }
            jwt.verify(token, config.jwt.secretKey, (error, decoded) => {
                if(error){
                    return next(new Error('인증 에러!!'));
                }
                next();
            });
        });
        this.io.on('connection', (socket) => {
            console.log('클라이언트 접속!');
        });
    }
}
let socket;

export function initSocket(server) {
    if(!socket){
        socket = new Socket();
    }
}
export function getSocketIo(){
    if(!socket){
        throw new Error('먼저 init를 실행하세요!');
    }
    return socket.io;
}

 

2. controller/auth.js

// 트윗을 생성하는 함수
export async function createTweet(req, res, next) {
    const { text } = req.body
    const tweet = await tweetRepository.create(text, req.userId)
    res.status(201).json(tweet)
    getSocketIo().emit('tweets', tweet)
}

 

3. app.js

import express from "express"
import morgan from "morgan"
import tweetsRouter from './router/tweets.js'
import authRouter from './router/auth.js'
import { config } from "./config.js"
import {connectDB} from './db/database.js'
import {initSocket} from './connection/socket.js'

const app = express()

app.use(express.json())
app.use(morgan("dev"))

app.use('/tweets', tweetsRouter)
app.use('/auth', authRouter)

app.use((req, res, next) => {
    res.status(404)
});

connectDB().then((db) => {
    const server = app.listen(config.host.port)
    initSocket(server)
}).catch(console.error)