inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

176만명의 커뮤니티!! 함께 토론해봐요.

쿠키관련) 로그아웃이 되지 않음

미해결

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

안녕하세요. 제로초님~! 강의를 잘 듣고 있습니다. 사소한 문제들은 혼자서 해결해 나가고 있는데, 이 부분은 질문을 검색해도 잘 나오지 않아 질문드립니다. 로그아웃 버튼 클릭시 로그아웃이 되지 않고 401 unauthorize 에러가 발생합니다. 미들웨어에서 res.status(401).send('로그인이 필요합니다')로 해놓은 에러 문구는 뜨지 않고, 콘솔에 401 에러가 뜨는데요. 먼저 isLoggedIn의 미들웨어에 문제가 있다고 생각해서, 브라우저 쿠키를 봤더니 아무것도 존재하지 않았어요 ㅠㅠ 그래서 제 생각에는 쿠키 문제인게 아닌가 하고 있습니다. 잘 안되서 깃헙에서 코드를 퍼와서 복붙해놓긴 했는데, 코드를 첨부합니다. passport) index.js const passport = require( 'passport' ); const local = require( './local' ); const { User } = require( '../models' ); module.exports = () => { passport.serializeUser((user, done) => { // 서버쪽에 [{ id: 1, cookie: 'clhxy' }] done( null , user.id); }); passport.deserializeUser( async (id, done) => { try { const user = await User.findOne({ where: { id } }); done( null , user); // req.user } catch (error) { console.error(error); done(error); } }); local(); }; // 프론트에서 서버로는 cookie만 보내요(clhxy) // 서버가 쿠키파서, 익스프레스 세션으로 쿠키 검사 후 id: 1 발견 // id: 1이 deserializeUser에 들어감 // req.user로 사용자 정보가 들어감 // 요청 보낼때마다 deserializeUser가 실행됨(db 요청 1번씩 실행) // 실무에서는 deserializeUser 결과물 캐싱 passport) local.js const passport = require( 'passport' ); const { Strategy: LocalStrategy } = require( 'passport-local' ); const bcrypt = require( 'bcrypt' ); const { User } = require( '../models' ); module.exports = () => { passport.use( new LocalStrategy( { usernameField: 'email' , passwordField: 'password' , }, async (email, password, done) => { try { const user = await User.findOne({ where: { email }, }); if (!user) { return done( null , false , { reason: '존재하지 않는 이메일입니다!' }); } const result = await bcrypt.compare(password, user.password); if (result) { return done( null , user); } return done( null , false , { reason: '비밀번호가 틀렸습니다.' }); } catch (error) { console.error(error); return done(error); } } ) ); }; routes) user.js const express = require( 'express' ); const bcrypt = require( 'bcrypt' ); const { User, Post } = require( '../models' ); const passport = require( 'passport' ); const router = express.Router(); const { isLoggedIn, isNotLoggedIn } = require( './middlewares' ); router.get( '/' , async (req, res, next) => { // GET /user try { if (req.user) { const fullUserWithoutPassword = await User.findOne({ where: { id: req.user.id }, attributes: { exclude: [ 'password' ], }, include: [ { model: Post, attributes: [ 'id' ], }, { model: User, as: 'Followings' , attributes: [ 'id' ], }, { model: User, as: 'Followers' , attributes: [ 'id' ], }, ], }); res.status( 200 ).json(fullUserWithoutPassword); } else { res.status( 200 ).json( null ); } } catch (error) { console.error(error); next(error); } }); router.post( '/login' , isNotLoggedIn, (req, res, next) => { passport.authenticate( 'local' , (err, user, info) => { if (err) { console.log(err); return next(err); } if (info) { return res.status( 403 ).send(info.reason); } return req.login(user, async (loginErr) => { if (loginErr) { console.log( 'loginErr' , loginErr); console.log( 'user' , user); return next(loginErr); } const fullUserWithoutPassword = await User.findOne({ where: { id: user.id }, attributes: { exclude: [ 'password' ], }, include: [ { model: Post, attributes: [ 'id' ], }, { model: User, as: 'Followings' , attributes: [ 'id' ], }, { model: User, as: 'Followers' , attributes: [ 'id' ], }, ], }); console.log(fullUserWithoutPassword); return res.status( 200 ).json(fullUserWithoutPassword); }); })(req, res, next); }); router.post( '/' , isNotLoggedIn, async (req, res, next) => { console.log(req.body); try { const exUser = await User.findOne({ where: { email: req.body.email, }, }); if (exUser) { return res.status( 403 ).send( '이미 사용중인 아이디입니다.' ); } const hashedPassword = await bcrypt.hash(req.body.password, 12 ); await User.create({ email: req.body.email, nickname: req.body.nickname, password: hashedPassword, }); // res.setHeader('Access-Control-Allow-Origin', '*'); res.status( 201 ).send( 'ok' ); } catch (error) { console.error(error); next(error); } }); router.post( '/logout' , isLoggedIn, (req, res, next) => { req.logout(); req.session.destroy(); res.send( 'ok' ); }); module.exports = router; routes) middlewares.js const express = require( 'express' ); const postRouter = require( './routes/post' ); const userRouter = require( './routes/user' ); const session = require( 'express-session' ); const cookieParser = require( 'cookie-parser' ); const passport = require( 'passport' ); const db = require( './models' ); const cors = require( 'cors' ); const passportConfig = require( './passport' ); const app = express(); const dotenv = require( 'dotenv' ); dotenv.config(); db.sequelize .sync() .then(() => { console.log( 'db 연결!!' ); }) .catch(console.error); passportConfig(); app.use(express.json()); app.use( cors({ origin: 'http://localhost:3060' , credentials: true , }) ); app.use(express.urlencoded({ extended: true })); app.use(cookieParser(process.env.COOKIE_SECRET)); app.use( session({ saveUninitialized: false , resave: false , secret: process.env.COOKIE_SECRET, }) ); app.use(passport.initialize()); app.use(passport.session()); app.get( '/' , (req, res) => { res.send( 'hello express' ); }); app.use( '/post' , postRouter); app.use( '/user' , userRouter); app.listen( 3065 , () => { console.log( '서버 실행 중!!! ' ); }); app.js const express = require( 'express' ); const postRouter = require( './routes/post' ); const userRouter = require( './routes/user' ); const session = require( 'express-session' ); const cookieParser = require( 'cookie-parser' ); const passport = require( 'passport' ); const db = require( './models' ); const cors = require( 'cors' ); const passportConfig = require( './passport' ); const app = express(); const dotenv = require( 'dotenv' ); dotenv.config(); db.sequelize .sync() .then(() => { console.log( 'db 연결!!' ); }) .catch(console.error); passportConfig(); app.use(express.json()); app.use( cors({ origin: 'http://localhost:3060' , credentials: true , }) ); app.use(express.urlencoded({ extended: true })); app.use(cookieParser(process.env.COOKIE_SECRET)); app.use( session({ saveUninitialized: false , resave: false , secret: process.env.COOKIE_SECRET, }) ); app.use(passport.initialize()); app.use(passport.session()); app.get( '/' , (req, res) => { res.send( 'hello express' ); }); app.use( '/post' , postRouter); app.use( '/user' , userRouter); app.listen( 3065 , () => { console.log( '서버 실행 중!!! ' ); }); 강의와 관련있는 질문 을 남겨주세요. • 강의와 관련이 없는 질문은 지식공유자가 답변하지 않을 수 있습니다. (사적 상담, 컨설팅, 과제 풀이 등) • 질문을 남기기 전, 비슷한 내용을 질문한 수강생이 있는지 먼저 검색 을 해주세요. (중복 질문을 자제해주세요.) • 서비스 운영 관련 질문은 인프런 우측 하단 ‘문의하기’ 를 이용해주세요. (영상 재생 문제, 사이트 버그, 강의 환불 등) 질문 전달 에도 요령이 필요합니다. • 지식공유자가 질문을 좀 더 쉽게 확인할 수 있게 도와주세요. • 강의실 페이지 (/lecture) 에서 '질문하기'를 이용해주시면 질문과 연관된 수업 영상 제목이 함께 등록됩니다. • 강의 대시보드에서 질문을 남길 경우, 관련 섹션 및 수업 제목을 기재 해주세요. • 수업 특정 구간에 대한 질문은 꼭 영상 타임코드 를 남겨주세요! 구체적인 질문 일수록 명확한 답을 받을 수 있어요. • 질문 제목은 핵심 키워드를 포함해 간결하게 적어주세요. • 질문 내용은 자세하게 적어주시되, 지식공유자가 답변할 수 있도록 구체적으로 남겨주세요 . • 정확한 질문 내용과 함께 코드 를 적어주시거나, 캡쳐 이미지 를 첨부하면 더욱 좋습니다. 기본적인 예의 를 지켜주세요. • 정중한 의견 및 문의 제시, 감사 인사 등의 커뮤니케이션은 더 나은 강의를 위한 기틀이 됩니다. • 질문이 있을 때에는 강의를 만든 지식공유자에 대한 기본적인 예의를 꼭 지켜주세요. • 반말, 욕설, 과격한 표현 등 지식공유자를 불쾌하게 할 수 있는 내용 은 스팸 처리 등 제재를 가할 수 있습니다.

  • Next.js
  • redux
  • nodejs
  • react
  • express
임수진 댓글 2 좋아요 0 조회수 515

장표 오타 제보입니다.

해결됨

Kevin의 알기 쉬운 RxJava 1부

안녕하세요 강의 잘 보고 있습니다. ㅎㅎ 퀴즈 3번 에 `List<Integer` 에 `>` 이게 빠졌습니다

  • 함수형-프로그래밍
  • RxJava
  • Reactive-Streams
  • Reactive Programming
ybs 댓글 1 좋아요 1 조회수 205

@Valid 와 @NotNull 을 사용할때

미해결

예제로 배우는 스프링부트 입문

전단되는 파라미터 들이 파일 업로드를 하기 위한 enctype="multipart/form-data" 로 전달되면 일반 request 로 받는 값이나 Controller 의 매서드의 매개변수로 있으면서 각 맴버를 받는 커맨드 객체가 @Valid 에 잘 적용되지 않습니다 @Valid 와 @NotNull 을 적용하려면 어떤 방법을 써야 하나요

  • spring-boot
heejoonk5 댓글 1 좋아요 0 조회수 237

Input UI 스타일링 부분에서 icon 버튼이 뜨지 않습니다.

미해결

Vue.js 중급 강좌 - 웹앱 제작으로 배워보는 Vue.js, ES6, Vuex

input UI 쪽에서 button 지우고 span에 awesome font icon 집어넣으면 input box 는 보이는데 icon 들어간 버튼은 보이지않습니다. CDN을 다른걸 가져왔는 확인했는데 뜨운 상태에서 개발자 도구 Elements에는 icon code 가 보입니다. 혹시 버전이 바뀌어선가 생각했는데 그건 혼자 확일을 못했습니다. 아래 TodoInput.vue 에 template와 style을 우선 캡쳐는 해봤습니다. elements와 현재 npm 버전은 6.14.8 이고 node 는 12.19.0 LTS , Vue-Cli 는 4.5.8 입니다.

  • javascript
  • es6
  • vuejs
  • vuex
nicolas83 댓글 1 좋아요 1 조회수 418

getOne 관련 에러 질문있습니다.

미해결

실전! 스프링 데이터 JPA

안녕하세요 수업 너무 재밌게 듣고 있습니다! 혼자 연습중에 난 에러인데 도무지 모르겠어서 질문드립니다. T getOne ( ID id) ; for (){ list.add( ~~~service.getOne) } for문 통해 배열에 엔티티를 넣고 담긴 리스트들을 map 형태로 프론트에 보내면 아래같은 에러가 발생합니다 com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: java.util.HashMap["list"]->java.util.ArrayList[0]->zen.zen.entity.Dog$HibernateProxy$4tYFCZYD["hibernateLazyInitializer"]) 반면 OPTIONAL 엔티티 반환하는 findById 를 통해 얻어 리스트로 바꾸고 map으로 보내면 제대로 작동합니다. getOne은 어떤이유에서 에러가 나는지 궁금합니다.

  • spring-boot
  • java
  • JPA
  • spring
clint1115 댓글 1 좋아요 0 조회수 202

소스코드 어디가서 볼 수 있을까요... 하 ㅜㅜ

미해결

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

소스 코드는 어디가서 볼 수 있을까요 ㅜ airbnb eslint 설치방법 따라하다가 멋대로 문법 고쳐서져서 엉망되었네요 ㅜ 생각보다 복잡스럽네요....

  • react
  • nodejs
  • express
  • redux
  • Next.js
이룸 댓글 1 좋아요 0 조회수 142

No message available 404

해결됨

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

안녕하세요 강사님 말씀하신 postman,intellij에서 실행 해봤는데 둘다 똑같은 오류가 뜨는데 왜 그럴까요..?

  • spring
  • java
  • JPA
  • spring-boot
qudwns6122 댓글 5 좋아요 0 조회수 1927

데이터 크기가 다릅니다.

미해결

[리뉴얼] 처음하는 파이썬 데이터 분석 (쉽게! 전처리, pandas, 시각화 전과정 익히기) [데이터분석/과학 Part1]

하기와 같이 행열 갯수가 다릅니다. 동일한 파일과 방법을 통해 진행했는데.. 어떤 데이터를 가져오지 못한지 확실히 모르겠네요. 엑셀 파일로 확인하니 2485개가 맞는 듯 한데..

  • pandas
  • python
임성비 댓글 3 좋아요 0 조회수 461

do while 부분 질문입니다.

미해결

윤재성의 Google 공식 언어 Kotlin 프로그래밍 시작하기

do while에서 do 부분을 딱 한번 실행하고 while 부분의 반복문을 실시하는거라고 알았는데요 그럼 그냥 do같은거 안쓰고 일반 코드를 쓰고 while 쓰면안되나요? 왜 굳이 do while을 쓰는건가요?

  • kotlin
  • android
ljws93 댓글 1 좋아요 0 조회수 392

키보드 따옴표 질문

미해결

제주코딩베이스캠프 Code Festival: JavaScript 100제

console.log('000 ${} 000') 이거 따옴표 키보드 어떤거 눌러야 하나요...

  • 코테 준비 같이 해요!
  • javascript
hhhhaz 댓글 1 좋아요 0 조회수 394

질문드립니다.

플렉스(Flex) 반응형 웹사이트 포트폴리오(The World's Best Cities)

삭제된 글입니다

  • flex
  • 반응형-웹
조용한 치타 댓글 1 좋아요 1 조회수 56

강좌에서 configure.js의 역할에 대해서 길을 잠시 잃은 것 같습니다.

미해결

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

thunk, saga와 같은 파일들을 redux configure.js에서 만들어서 export하는데, redux가 직접만든 중앙 환경설정 저장소라고 이해하고 있으면 될까요? 간단한 질문이지만, 코드를 따라하면서 개념이 옅어지는 것 같아 확인자 질문드립니다.

  • react
  • express
  • nodejs
  • redux
  • Next.js
groovejumat 댓글 1 좋아요 0 조회수 130

footer > div 에 임시 보더 그려줬고요.

미해결

[2026년 출제기준] 웹디자인개발기능사 실기시험 완벽 가이드

.copyright div 에도 임시보더 줬구요. 높이 100픽셀에서 보더사이징으로 위아래 1픽셀씩 잡아먹고있는데 어떻게 50픽셀*2가 들어가는 것이죠? footer > div (h100px) / .copyright div (h50px * 2) ???

  • jquery
  • 웹 디자인
  • HTML/CSS
protoris 댓글 1 좋아요 2 조회수 135

반복문 error

미해결

텍스트마이닝 실전 프로젝트 - 우리집 주변 맛집 랭킹 매기기

각각의 url주소를 입력해서 출력하면 블로그내용이 나오지만 반복문 사용시 계속 위와 같은 error가 발생합니다. 지난번 크롤링 실습에서도 이런문제가 발생했을때 Sys.sleep(10)을 넣어주면 해결이 되서 이번에도 동일하게 넣어봤지만 계속 똑같은 error가 발생합니다. 잘못된 부분이 있는지 확인 한번 부탁드리겠습니다.

  • R
  • 웹-크롤링
  • bigdata
Rachel19 댓글 1 좋아요 0 조회수 269

리뉴얼 쿠폰 요청드려도 될까요?

미해결

쉽게 배우는 Webpack

작년에 Vue프로젝트가 진행이 안되서 올해 다시 강의를 들으려구 하니 기초 Vue도 갱신되고 Webpack부분도 리뉴얼 됬네요 혹시 쿠폰 발급 가능할까요?

  • 웹팩
  • Bundling
Mola-Mola 댓글 2 좋아요 1 조회수 303

eslint 설정에 관하여

미해결

타입스크립트 입문 - 기초부터 실전까지

선생님, 안녕하세요. 저는 eslint에서 잡아준다는 밑줄이 안나오는데요. eslint에서 설정해야 되는게 있나요?

  • typescript
  • es6
  • javascript
hwd3527 댓글 3 좋아요 1 조회수 1003

인기 태그

인프런 TOP Writers

주간 인기글