2 글 보임 - 1 에서 2 까지 (총 2 중에서)
-
글쓴이글
-
2024년 7월 2일 17:26 #127115
J참가자require("dotenv").config(); const express = require("express");
const passport = require("passport"); const LocalStrategy = require("passport-local"); const bcrypt = require("bcrypt"); const app = express(); const cors = require("cors"); app.use( cors({ origin: "http://localhost:3000", credentials: true, }) ); const { createServer } = require("http"); const { Server } = require("socket.io"); const session = require("express-session"); const server = createServer(app);
const MongoStore = require("connect-mongo"); const { loginCheck } = require("./middlewares.cjs");
// 클라이언트랑 서버랑 다른 포트에서 통신할때 cors 에러가 발생함 // cors 에러를 해결하기 위해서 cors 미들웨어를 추가해줘야함
const url = process.env.DB_URL; // 내 몽고 DB URL env에 저장해둔거 // app.use( // session({ // secret: "암호화에 쓸 비번", // resave: false, // saveUninitialized: false, // cookie: { maxAge: 60 * 60 * 1000 }, // store: MongoStore.create({ mongoUrl: url, dbName: "forum" }), // }) // ); const io = new Server(server, { cors: { origin: "http://localhost:3000", // 클라이언트 주소 methods: ["GET", "POST"], // 허용할 HTTP 메소드 credentials: true, // 크레덴셜(쿠키 등)을 허용할지 여부 }, }); const sessionMiddleware = session({ secret: "암호화비번", resave: true, saveUninitialized: true, cookie: { maxAge: 60 * 60 * 1000 }, store: MongoStore.create({ mongoUrl: url, dbName: "forum" }), });
app.use(sessionMiddleware);
app.use(passport.initialize()); app.use(passport.session());
let { connectDB, ObjectId } = require("./database.cjs"); // DB연결 let db; app.use(express.json()); // 요청 본문을 파싱하는 미들웨어를 추가합니다. app.use(express.urlencoded({ extended: true }));
connectDB .then((client) => { console.log("DB연결성공"); db = client.db("forum");
server.listen(process.env.PORT, () => { console.log("http://localhost:4000 에서 서버 실행중"); }); }) .catch((err) => { console.log(err); });
passport.use( new LocalStrategy(async (입력한아이디, 입력한비번, cb) => { let result = await db .collection("user") .findOne({ username: 입력한아이디 }); if (!result) { return cb(null, false, { message: "아이디 DB에 없음" }); }
if (await bcrypt.compare(입력한비번, result.password)) { console.log("비번일치"); return cb(null, result); } else { return cb(null, false, { message: "비번불일치" }); } }) ); // 로그인 성공시 유저에케 쿠키 전송 passport.serializeUser((user, done) => { process.nextTick(() => { done(null, { id: user._id, userId: user.username }); }); }); // 쿠키 유효한 쿠키인지 확인 passport.deserializeUser(async (user, done) => { let result = await db .collection("user") .findOne({ _id: new ObjectId(user.id) }); delete result.password; process.nextTick(() => { done(null, result); }); });
/*
나머지 서버코드 제외
*/
const wrap = (middleware) => (socket, next) => middleware(socket.request, {}, next); io.use(wrap(sessionMiddleware));
io.use(wrap(passport.initialize())); io.use(wrap(passport.session()));
// io.use((socket, next) => { // if (socket.request.user) { // next(); // } else { // next(new Error("unauthorized")); // } // });
io.on("connection", (socket) => { console.log("연결", socket.id); console.log("유저", socket.request.user); console.log("세션", socket.request.session); socket.on("ask-join", (data) => { socket.join(data.room); }); socket.on("message", (data) => { io.to(data.room).emit("broadcast", data.msg); }); });
# 강좌에 https://socket.io/how-to/use-with-express-session 를 봐도 잘 모르겠어서 검색이랑 chatgpt한테 물어보면서 햇습니다
아래쪽에서 콘솔을 찍으면
연결 T4OKbp7_qM4kvJWMAAAV 유저 undefined 세션 Session { cookie: { path: '/', _expires: 2024-07-02T09:20:00.332Z, originalMaxAge: 3600000, httpOnly: true } }
뭔가 연결은되어 있는거 같은데 유저 정보가 안나와서 어느부분이 잘못된건지 모르겠습니다 ㅠㅠ
-
글쓴이글
2 글 보임 - 1 에서 2 까지 (총 2 중에서)
- 답변은 로그인 후 가능합니다.