• 로그인
  • 장바구니에 상품이 없습니다.

home2 게시판 Node.js, Express 게시판 socket.io 유저 정보 관련 질문입니다

socket.io 유저 정보 관련 질문입니다

  • 이 주제에는 1개 답변, 2명 참여가 있으며 codingapple1 년 전에 전에 마지막으로 업데이트했습니다.
2 글 보임 - 1 에서 2 까지 (총 2 중에서)
  • 글쓴이
  • #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
    }
    }
    
    
    뭔가 연결은되어 있는거 같은데 유저 정보가 안나와서 어느부분이 잘못된건지 모르겠습니다 ㅠㅠ
     
     
     
     
    #127132

    codingapple
    키 마스터
    io.engine.use(sessionMiddleware); 이런 코드 상단에 추가해봅시다
2 글 보임 - 1 에서 2 까지 (총 2 중에서)
  • 답변은 로그인 후 가능합니다.

About

현재 월 700명 신규수강중입니다.

  (09:00~20:00) 빠른 상담은 카톡 플러스친구 코딩애플 (링크)
  admin@codingapple.com
  이용약관
ⓒ Codingapple, 강의 예제, 영상 복제 금지
top

© Codingapple, All rights reserved. 슈퍼로켓 에듀케이션 / 서울특별시 강동구 고덕로 19길 30 / 사업자등록번호 : 212-26-14752 온라인 교육학원업 / 통신판매업신고번호 : 제 2017-서울강동-0002 호 / 개인정보관리자 : 박종흠