인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

이승주님의 프로필 이미지
이승주

작성한 질문수

[리뉴얼] React로 NodeBird SNS 만들기

쿠키/세션과 전체 로그인 흐름.

로그인시 500 오류 발생하는데 이유를 모르겠습니다 ㅠㅠ

작성

·

697

0

안녕하세요~ 강의 열심히듣고 있다가 ㅠ 막혀서 진도를 나가지 못하고 있습니다.
회원가입하고 디비에 제대로 쌓인거 확인 후 해당 아이디로 로그인 하려하니 다음과 같은 오류들이 확인되고 로그인이 되지 않습니다. 강의를 여러번 돌려도 확인이 어렵네요 ㅠ 도움 부탁 드립니다.

답변 3

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

app.js에서 라우터들을 익스프레스 세션보다 아래 두셔야 합니다.

이승주님의 프로필 이미지
이승주
질문자

아 순서도 중요하군요~ 감사합니다~

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

네 위에서부터 순서대로 실행돼서 미들웨어들이 연결된 후에 라우터가 실행돼야 합니다.

0

이승주님의 프로필 이미지
이승주
질문자

<routes/user.js>

const express = require("express");
const { User } = require("../models");
const router = express.Router();
const bcrypt = require("bcrypt");
const passport = require("passport");

//전략실행, 미들웨어 확정 authenticate가 (req, res, next)  를 쓸수 있게
// router.post("/login", isNotLoggedIn, (req, res, next) => {
router.post("/login", (req, res, next) => {
  passport.authenticate("local", (err, user, info) => {
    if (err) {
      console.error(err);
      //서버 에러
      return next(err);
    }
    if (info) {
      //info가 있다는건 client 에러가 있다는거, 클라이언트로 응답 보내주는거
      // 401: 미인증
      return res.status(401).send(info.reason);
    }
    return req.login(user, async (loginErr) => {
      // passport/nde.js 안 serializeUsert실행
      //서비스 로그인 에러가 아니라 passport로그인 에러, 잘 발생하지 않음
      if (loginErr) {
        console.error(loginErr);
        return next(loginErr);
      }

      //사용자 정보를 프론트로 넘기기
      return res.status(200).json(user);
    });
  })(req, res, next);
});

router.post("/", async (req, res, next) => {
  //POST/user/
  //뒤에 숫자는 암호의 난이도
  const hashedPassword = await bcrypt.hash(req.body.password, 12);
  //생략 됏지만 실제로는  /POST/user
  // await를 안쓰면 비동기가 되서 res.send()이 먼저 실행 될수 있음
  try {
    // findOne디비 안 중복 데이터 찾는 함수_시퀄라이즈
    const exUser = await User.findOne({
      where: {
        email: req.body.email,
      },
    });
    if (exUser) {
      // return을 써서 라우터 종료
      return res.status(403).send("이미 사용 중인 아이디입니다.");
    }

    await User.create({
      email: req.body.email,
      nickname: req.body.nickname,
      password: hashedPassword,
    });
    res.status(201).send("ok");
  } catch (error) {
    console.error(error);
    next(error); // status 500
  }
  res.send("ok");
});

 
module.exports = router;

0

이승주님의 프로필 이미지
이승주
질문자

<app.js>


 
const express = require("express");
const postRouter = require("./routes/post");
const userRouter = require("./routes/user");
const db = require("./models");
const cors = require("cors");
const passportConfig = require("./passport");
const session = require("express-session");
const cookieParser = require("cookie-parser");
const passport = require("passport");
const dotenv = require("dotenv");

dotenv.config();
const app = express();

db.sequelize
  .sync()
  .then(() => {
    console.log("db연결 성공!");
  })
  .catch(console.error);

passportConfig();

//프론트에서 넘어온 데이터를 해석해서 라우터의 양식(req body)에 넘겨준다
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

 
app.get("/", (req, res) => {
  res.send("hello express");
});

app.get("/api", (req, res) => {
  res.send("hello express/api");
});

// get: 가져오는거 , post: 생성하다 요청 데이터 처리 메시지 바디를 통해 서버로 요청 데이터 전달, delete: 지우기, put:전체수정하다,patch:전체 수정
app.get("/api/posts", (req, res) => {
  res.json([
    { id: 1, content: "hello" },
    { id: 2, content: "hello2" },
    { id: 3, content: "hello3" },
  ]);
});

 
 
app.use(
  cors({
    origin: "*",
    credentials: false,
  })
);
app.use("/post", postRouter);
app.use("/user", userRouter);

app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(
  session({
    saveUninitialized: false,
    resave: false,
    secret: process.env.COOKIE_SECRET,
    // cookie: {
    //   httpOnly: true,
    //   secure: false,
    //   domain: process.env.NODE_ENV === "production" && ".nodebird.com",
    // },
  })
);
app.use(passport.initialize());
app.use(passport.session());

app.listen(3065, () => {
  console.log("백엔드 서버 실행 중");
});
이승주님의 프로필 이미지
이승주

작성한 질문수

질문하기