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)