묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[리뉴얼] 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) 에서 '질문하기'를 이용해주시면 질문과 연관된 수업 영상 제목이 함께 등록됩니다.• 강의 대시보드에서 질문을 남길 경우, 관련 섹션 및 수업 제목을 기재해주세요. • 수업 특정 구간에 대한 질문은 꼭 영상 타임코드를 남겨주세요! 구체적인 질문일수록 명확한 답을 받을 수 있어요.• 질문 제목은 핵심 키워드를 포함해 간결하게 적어주세요.• 질문 내용은 자세하게 적어주시되, 지식공유자가 답변할 수 있도록 구체적으로 남겨주세요.• 정확한 질문 내용과 함께 코드를 적어주시거나, 캡쳐 이미지를 첨부하면 더욱 좋습니다. 기본적인 예의를 지켜주세요.• 정중한 의견 및 문의 제시, 감사 인사 등의 커뮤니케이션은 더 나은 강의를 위한 기틀이 됩니다. • 질문이 있을 때에는 강의를 만든 지식공유자에 대한 기본적인 예의를 꼭 지켜주세요. • 반말, 욕설, 과격한 표현 등 지식공유자를 불쾌하게 할 수 있는 내용은 스팸 처리 등 제재를 가할 수 있습니다.
-
해결됨Kevin의 알기 쉬운 RxJava 1부
장표 오타 제보입니다.
안녕하세요 강의 잘 보고 있습니다. ㅎㅎ 퀴즈 3번 에 `List<Integer` 에 `>` 이게 빠졌습니다
-
미해결예제로 배우는 스프링부트 입문
@Valid 와 @NotNull 을 사용할때
전단되는 파라미터 들이 파일 업로드를 하기 위한 enctype="multipart/form-data" 로 전달되면 일반 request 로 받는 값이나 Controller 의 매서드의 매개변수로 있으면서 각 맴버를 받는 커맨드 객체가 @Valid 에 잘 적용되지 않습니다 @Valid 와 @NotNull 을 적용하려면 어떤 방법을 써야 하나요
-
미해결Vue.js 중급 강좌 - 웹앱 제작으로 배워보는 Vue.js, ES6, Vuex
Input UI 스타일링 부분에서 icon 버튼이 뜨지 않습니다.
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 입니다.
-
미해결실전! 스프링 데이터 JPA
getOne 관련 에러 질문있습니다.
안녕하세요 수업 너무 재밌게 듣고 있습니다! 혼자 연습중에 난 에러인데 도무지 모르겠어서 질문드립니다. 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은 어떤이유에서 에러가 나는지 궁금합니다.
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
소스코드 어디가서 볼 수 있을까요... 하 ㅜㅜ
소스 코드는 어디가서 볼 수 있을까요 ㅜ airbnb eslint 설치방법 따라하다가 멋대로 문법 고쳐서져서 엉망되었네요 ㅜ 생각보다 복잡스럽네요....
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
No message available 404
안녕하세요 강사님 말씀하신 postman,intellij에서 실행 해봤는데 둘다 똑같은 오류가 뜨는데 왜 그럴까요..?
-
미해결[리뉴얼] 처음하는 파이썬 데이터 분석 (쉽게! 전처리, pandas, 시각화 전과정 익히기) [데이터분석/과학 Part1]
데이터 크기가 다릅니다.
하기와 같이 행열 갯수가 다릅니다. 동일한 파일과 방법을 통해 진행했는데.. 어떤 데이터를 가져오지 못한지 확실히 모르겠네요. 엑셀 파일로 확인하니 2485개가 맞는 듯 한데..
-
미해결윤재성의 Google 공식 언어 Kotlin 프로그래밍 시작하기
do while 부분 질문입니다.
do while에서 do 부분을 딱 한번 실행하고 while 부분의 반복문을 실시하는거라고 알았는데요 그럼 그냥 do같은거 안쓰고 일반 코드를 쓰고 while 쓰면안되나요? 왜 굳이 do while을 쓰는건가요?
-
미해결윤재성의 안드로이드를 위한 자바(JAVA) 프로그래밍
맥북에서 java 파일로 저장하기 위해 '모든파일' 이라는 파일형식은 어떻게 하나요?
맥북 사용자인데, 텍스트 편집기에서 어떻게 '모든파일'이란 형식으로 저장 가능한가요? .java 확장자만 쓸 수 있는 방법을 알려주세요 !
-
미해결제주코딩베이스캠프 Code Festival: JavaScript 100제
키보드 따옴표 질문
console.log('000 ${} 000') 이거 따옴표 키보드 어떤거 눌러야 하나요...
-
플렉스(Flex) 반응형 웹사이트 포트폴리오(The World's Best Cities)
질문드립니다.
삭제된 글입니다
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
강좌에서 configure.js의 역할에 대해서 길을 잠시 잃은 것 같습니다.
thunk, saga와 같은 파일들을 redux configure.js에서 만들어서 export하는데, redux가 직접만든 중앙 환경설정 저장소라고 이해하고 있으면 될까요? 간단한 질문이지만, 코드를 따라하면서 개념이 옅어지는 것 같아 확인자 질문드립니다.
-
[리뉴얼] React로 NodeBird SNS 만들기
배포 서버에서 req.user 가 생성이 안되는거 같아여
삭제된 글입니다
-
[리뉴얼] React로 NodeBird SNS 만들기
key = {post.id} 가 안겹치는데 중복이라고 나와서여
삭제된 글입니다
-
[리뉴얼] React로 NodeBird SNS 만들기
로컬에서도 포트 번호를 다 바꿔야 되나여?
삭제된 글입니다
-
미해결[2026년 출제기준] 웹디자인개발기능사 실기시험 완벽 가이드
footer > div 에 임시 보더 그려줬고요.
.copyright div 에도 임시보더 줬구요. 높이 100픽셀에서 보더사이징으로 위아래 1픽셀씩 잡아먹고있는데 어떻게 50픽셀*2가 들어가는 것이죠? footer > div (h100px) / .copyright div (h50px * 2) ???
-
미해결텍스트마이닝 실전 프로젝트 - 우리집 주변 맛집 랭킹 매기기
반복문 error
각각의 url주소를 입력해서 출력하면 블로그내용이 나오지만 반복문 사용시 계속 위와 같은 error가 발생합니다. 지난번 크롤링 실습에서도 이런문제가 발생했을때 Sys.sleep(10)을 넣어주면 해결이 되서 이번에도 동일하게 넣어봤지만 계속 똑같은 error가 발생합니다. 잘못된 부분이 있는지 확인 한번 부탁드리겠습니다.
-
미해결쉽게 배우는 Webpack
리뉴얼 쿠폰 요청드려도 될까요?
작년에 Vue프로젝트가 진행이 안되서 올해 다시 강의를 들으려구 하니 기초 Vue도 갱신되고 Webpack부분도 리뉴얼 됬네요 혹시 쿠폰 발급 가능할까요?
-
미해결타입스크립트 입문 - 기초부터 실전까지
eslint 설정에 관하여
선생님, 안녕하세요. 저는 eslint에서 잡아준다는 밑줄이 안나오는데요. eslint에서 설정해야 되는게 있나요?