Thumbnail
BEST 개발 ・ 프로그래밍 프로그래밍 언어
Node.js 교과서 - 기본부터 프로젝트 실습까지
(4.4)
44개의 수강평 ∙ 968명의 수강생
공개되지 않은 강의로
수강이 제한됩니다.
지식공유자 : 조현영
총 145개 수업˙총 24시간 24분
평생 무제한 수강
수료증 발급 강의
초급 대상
이 강의는 멘토링 신청이 가능합니다.
멘토링은 수강 신청과 별개로 운영되며, 수강생이 아니어도 신청할 수 있습니다.
김경근 프로필

9장 세션을 DB에 저장시 리다이렉션 오류 발생 김경근 16일 전
9장 강의를 실습하고 나서 session을 DB에 저장하고 싶어 connect-session-sequelize를 이용하여  MySQL의 session 테이블에 저장하는 데 까지는 성공했습니다. 하지만 강의 대로 passport를 이용하여 로그인을 구현한 상태로 로그인을 시도하면 로그인이 된 상태가 새로고침을 해야 반영되는 오류가 발생하는 것을 알게되었습니다. 로그인 버튼을 누른 후 정상적으로 redirect 될 때가 있고, 로그인 후 redirect를 해도 로그인이  안된 상태의 페이지에 머무르는 상태가 될떄도 있어서 정확히 제가 무슨 실수를 했는지 판단할 수가 없습니다. 더 당혹스러운 점은 session을 DB에 저장하지 않고 진행하면 이런 현상은 나타나지 않아서 DB에 session을 저장하는 과정에서 오류가 발생한다는 것 까지만 추측한 상태입니다. 로그인 할때마다 새로고침을 강제할 수도 없는 상황이라 어떻게 해결해야 할지 정말 막막한 상태입니다. 브라우저 캐시 문제인지도 확신이 서질 않습니다. 주변에 도움을 구할 수 있는 분이 없는 상태라 이렇게 제로초님께 질문하게 되었습니다. 혹시 제 코드에 문제가 있는지 봐주시면 정말 감사하겠습니다.또 이런 현상이 왜 나타나는지 제로초님의 생각을 들어보고 싶습니다. Github

8
김기현 프로필

프레임워크 선택에 관하여 질문이 있습니다. 김기현 1달 전
Node.js는 I/O에 특화되어있고 json데이터를 제공하는 api 서버에 많이 사용합니다. 이미지/비디오, 빅데이터 처리 등 cpu를 많이 사용하는 작업에는 적합하지 않다고 책(Node.js교과서)에 나와있습니다. 그렇다면 이미지 프로세싱(컴퓨터 비전관련) 작업은 Node.js로 하지않고 이미지/비디오 데이터만 저장/응답해주는 역할만 한다고 했을 때 Node.js가 적합한 프레임워크인지가 궁금합니다. 즉, 많은 사용자에게 큰데이터(이미지/비디오)를 I/O를 해준다면 Node.js가 올바른 선택인지가 궁금합니다. 예를 들면  Node.js에서는 이미지/비디오를 별도의 Storage(AWS의 S3 같은것...)에 upload하고 Storage의 url만 DB에 저장해놓습니다. 그리고 downlaod시에는 DB를 뒤져서 올바른 Storage의 url을 받아서 해당 Storage에서 직접 download 방식을 만드려고 하는데 이경우 Node.js가 효율적인 선택인걸까요?

3
이발사 프로필

시퀄라이즈 질문입니다 ! ! 이발사 1달 전
시퀄라이즈로 mindmap 테이블과 keyword 테이블을 다대다 관계로 설정했습니다. (매핑 테이블로는 mindmap_keyword로 설정했습니다) 그리고 http://localhost:3000/mindmap/1 와 같이 요청을 했을 때 위의 로직이 실행되는 상황입니다. 그리고 포스트맨으로 테스트를 해보았습니다.  그러면 위와 같이 원하는 결과를 얻었습니다. 그런데 데이터구조가 맘에 들지 않아서 검색해보다가 raw: true라는 것을 보아 적용해보았습니다.  그리고 다시 포스트맨으로 테스트를 해보았습니다. 그러면 위와 같이 아까보다는 데이터 구조가 단순해지기는 했는데 이름이 맘에 들지 않습니다 ㅜ ㅜ  그냥 keywordCount: 3 으로만 보내주고 싶은데 이럴 경우에는 어떻게 해야 하는지 궁금해서 질문드립니다! !  감사합니다 ! ! 

1
김경근 프로필

리뉴얼 강의 12강 socket.io에서 req.session접근 관련 질문 김경근 2달 전
socket.request.session에서는 color에 접근할 수 없기때문에 app.js에서 sessionMiddleware를 따로 분리하여 socket.js에 넘겨주어 socket.request.session에서 color 속성에 접근할수 있게 했는데 "Cannot read property 'color' of undefined" 오류가 발생하는네요 원인을 모르겠습니다 제가 코드를 잘못작성한것 같아서 github 코드를 참고하여 수정해봤는데도 계속 이런 현상이 나타나네요 콘솔로 socket.request.session을 찍어보는데 아예 undefined가 출력되는걸 봐서 socket.request.session에 request.session이 전달되지 않는것 같습니다 https://socket.io/docs/v3/faq/index.html 혹시 express-session에 접근할 수 있는 다른 방법이 있나 공식문서를 참고해봤는데 강의내용과 다르지 않더라구요 더 찾아본 결과 express-socket.io-session 라이브러리가 존재하는걸 확인했는데 이걸 사용해야 하나 고민입니다

6
김태준 프로필

oAuth 질문입니다. 김태준 2달 전
세션이 아닌 REST API로 접근을 한다고 했을 때, 어떤식으로 구현을 해야 하는지 질문을 드립니다. 우선 생각했던 방법은 로그인 시에 각 oAuth 제공 플랫폼이 주는 고유 식별 값이 있으니 그걸 DB에 저장하고, 매 Request마다, accessToken의 유효성 검사 및, 고유 식별자 값이 DB에있다면 DB에 접근, 없으면 회원가입 이러한 방식으로 구현하려 했으나, 모든 Request마다, oAuth서버에 접근해서 알아오는 것이 과연 맞는가 생각해보게 되었습니다. 혹시 accessToken과 refreshToken, expire을 DB에 저장해놓고 있고, 내부 로직으로만 확인하고 독자적으로 저만의 JWT를 구성하고 인증을한 다음 해당 플랫폼의 정보에 접근할 때만 oAuthAccessToken을 사용하면 되는 것인지요... 조언부탁드립니다...

3
김진한 프로필

GCP 질문입니다. 김진한 2달 전
1. 서버를 실행하려고 sudo npm start를 하고 pm2 monit으로 로그를 보면 Error: bind EACCES null:80  위와 같은 에러가 나옵니다.  sudo를 입력했는데도 왜 안될까요?? 애매한 질문입니다만 예상되는 부분만이라도 이야기 해주셨으면 합니다. 2. 80번 포트가 되지 않는 것 같아서 포트를 바꿔보기로 했습니다. package.json의 "start": "cross-env NODE_ENV=production PORT=80 pm2 start app.js -i -1"에서 PORT=8080으로 바꾸고 GCP 방화벽에서 8080번 포트 설정을 하고 실행하니까 서버에 접속은 됐습니다. 그런데 main.css가 불러와지지 않고,  크롬 개발자도구 네트워크 탭을 보니 http://(제 아이피):8080 이후에 https://(제 아이피):8080/main.css https로 시도하고 있어서 안되고 있는 것 같습니다. layout.pug에서 link(rel='stylesheet' href='/main.css')에서 href를 http://(제 아이피):8080/main.css로 바꿔도 되지가 않고... 어떻게 해야 css를 http로 요청해서 받을 수 있을까요?

1
kchryu 프로필

Passport 모듈 로그인 구현관련 kchryu 2달 전
Passport 모듈 구현관련 다음 에러가 발생하네요... 다른곳 찾아보니 노드모듈과 패키지락제이슨을 지우고 npm install 다시하라는데 안되네요. node:internal/modules/cjs/loader:903   throw err;   ^   Error: Cannot find module './Strategy' Require stack: - D:\webcoding\NodeJS_Zerocho\nodebird\node_modules\passport-kakao\dist\passport-kakao.js - D:\webcoding\NodeJS_Zerocho\nodebird\passport\kakaoStrategy.js - D:\webcoding\NodeJS_Zerocho\nodebird\passport\index.js - D:\webcoding\NodeJS_Zerocho\nodebird\app.js     at Function.Module._resolveFilename (node:internal/modules/cjs/loader:900:15)     at Function.Module._load (node:internal/modules/cjs/loader:745:27)     at Module.require (node:internal/modules/cjs/loader:972:19)     at require (node:internal/modules/cjs/helpers:88:18)     at Object.<anonymous> (D:\webcoding\NodeJS_Zerocho\nodebird\node_modules\passport-kakao\dist\passport-kakao.js:6:34)     at Module._compile (node:internal/modules/cjs/loader:1083:30)     at Object.Module._extensions..js (node:internal/modules/cjs/loader:1112:10)     at Module.load (node:internal/modules/cjs/loader:948:32)     at Function.Module._load (node:internal/modules/cjs/loader:789:14)     at Module.require (node:internal/modules/cjs/loader:972:19) {   code: 'MODULE_NOT_FOUND',   requireStack: [     'D:\\webcoding\\NodeJS_Zerocho\\nodebird\\node_modules\\passport-kakao\\dist\\passport-kakao.js',     'D:\\webcoding\\NodeJS_Zerocho\\nodebird\\passport\\kakaoStrategy.js',     'D:\\webcoding\\NodeJS_Zerocho\\nodebird\\passport\\index.js',     'D:\\webcoding\\NodeJS_Zerocho\\nodebird\\app.js'   ] }

6
이발사 프로필

카카오 로그인 관련 질문입니다!! 이발사 2달 전
routes/auth.js에 위와 같이 코드를 작성하고, routes/index.js에 /auth로 연결해서 현재 URI는 /auth/kakao, /auth/kakao/callback인 상태입니다! (그리고 추가적으로 developers.kakao.com에서 필요한 설정들은 해두었습니다) ex) Redirect URI, 동의화면 ) 그리고 npm start를 한 후에 크롬에서 http://localhost:3000/auth/kakao를 요청했습니다. 그러면  이렇게 accessToken, refreshToken과 code는 URI에 담겨서 응답이 오는데 [동의화면]이 뜨지 않습니다.. (profile도 잘 응답이 오는데 캡쳐를 위해서 잠시 콘솔에서 빼놓고 캡쳐를 했습니다) 크롬에서 요청을 하면 콘솔에는 찍히지만 브라우저에는 삥삥돌아가는 표시만 나고 아무것도 뜨지 않습니다.  질문  1. [동의 화면]이 뜨지 않는 이유를 모르겠습니다,,   감사합니다!! 

4
김경근 프로필

스스로 해보기 10-16 nunjuncks 질문있습니다 김경근 3달 전
제가 리뉴얼버전으로 코드를 작성해서 main.html이 nunjucks로 되어있습니다 제가 어려움을 겪고 있는 부분이 좋아요와 좋아요취소 부분인데 특정 post의 좋아요를 누르면 좋아요가 좋아요 취소로 보이게 하고 싶습니다 강의에서는 map을 이용해서 post모델의 Liker에 있는 User모델들의 id값을 배열로 추출해서 user.id가 존재하는지 여부로 좋아요를 좋아요취소로 바뀌도록 구현하셨는데 nunjucks로 구현하려하니 map도 쓸수 없고 {% %}안에 자바스크립트 코드를 사용하는데 한계가 있는것 같더라구요 이 부분을 nunjucks로 어떻게 구현해야 할지 몰라서 질문올립니다

5
ritmakid@hotmail.com 프로필

제로초님 HTTP 완벽가이드 추천해주신거 너무 잘 읽었습니다. ritmakid@hotmail.com 4달 전
제로초님 노드 js교과서 예전버전과 유튜브에 올려주식 새 버전 모두 너무 감사하게 잘 듣고 있습니다. 강의 중간에 소개해주셨던 HTTP 완벽가이드책을 보면서 HTTP를 한번 훓었는데 HTTP 전체 개념을 잡는데 정말 큰 도움이 된것 같습니다. 너무 좋은 책 소개해주셔서 감사드립니다. 다름이 아니라 HTTP 공부 뒤에 운영체제도 공부해보려고 하는데 혹시 추천해주실만한 책이 있는지 물어봐도 될까요?현재 알아본것은 - 운영체제 (일명 공룡책)- 그림으로 배우는 구조와 원리 운영체제- 운영체제와 정보기술의 원리 이렇게 세권이 좋다는 말은 들었습니다. HTTP 완벽가이드처럼 입문자도 쉽게 이해할수 있으면서 필수개념은 다 익힐 수 있는 책을 공부하고 싶은데 혹시 조언을 부탁드려도 되는지 여쭙고 싶습니다. 강의와 관계없는 질문이라 물어보기 죄송한데 주변에 조언을 얻을만한 곳이 없어서 이곳에 올립니다.좋은 하루 보내시기 바랍니다!

2
데구리 프로필

gif채팅방 nunjucks관련 질문입니다! 데구리 4달 전
gif채팅방 만들기에서 제로초님께서 nunjucks로 짜신 코드 복붙해서 하니까 너무 잘돌아갑니다! 근데 사진처럼 css적용하는 부분에서 문법오류가 떠서 안사라지는데 혹시 없앨 수 있는 방법이 없을까요...??

3
세로수 프로필

현영님 몽고db관련 질문입니다. 세로수 4달 전
제가 현영님 강의를 본다음 노드로 api 서버를 만들었습니다. 그런데 aws ec2에 배포하려고 이것저것 찾아보니 오토스케일링이나 확장성 문제등등 때문에 디비서버랑 was랑 분리하는게 좋다고 해서 해보려고하니 헷갈리는게 있어서 질문드립니다. 1. 하나의 서버에 was와 db서버를 같이 돌린다는 게 무슨 뜻인가요? 2. 몽구스로 쿼리작업을 할 때 따로 몽고디비 서버를 키진 않는데(몽고db를 사용할 일이 있을 때마다 mongod 명령어로 서버를 실행해야 한다고 봤습니다), /(approot)/models/index.js에 몽구스로 connect.on 하면 자동으로 몽고db가 실행되는건지 아니면 몽고 db를 설치하면 백그라운드에서 계속 켜져있는 것인지 궁금합니다. 3. 어떤상태가 몽고db서버랑 was를 분리된 상태인거고 어떻게 해야 하나요? (ec2로 예시들어주시면 더 감사드립니다!) 감사합니다. 

3
vbkj 프로필

github 코드 질문있습니다 vbkj 4달 전
강의에 나오는 링크로 접속하면 , 존재하지않는 페이지라고 떠서 repository 찾아서 restFront.js 를 찾아서 코드를 보니까 , 강의 영상에 있는 코드와 다르더라고요 ㅠㅠ 혹시 같은 코드로 올라온 것은 없을까여?

1
Baekgyu Koh 프로필

sns 만들기 강의 중 pug 코드 질문입니다. Baekgyu Koh 4달 전
1) 위에 밑줄 친 부분의 코드가 의미하는게 뭔지 잘 이해가 안가네요;; 2) 변수 follow 에는 boolean 값이 들어갈 거 같은데, user.Followings 배열에 어떤값이 들어가는지 모르겠습니다. twit.user.id는 글쓴 사람의 아이디인가요?

1
Baekgyu Koh 프로필

sns 강의 수강 중 질문있습니다. Baekgyu Koh 4달 전
게시글 업로드 구현하기 까지 수강해서 아래 사진까지 구현하였습니다.  이 상태에서 회원가입 하고 그 아이디로 로그인하면 아래같은 메시지가 뜨는데 왜 그런건가요?? router index 파일 입니다. router.get("/", async (req, res, next) => { await Post.findAll({ include: { model: User, attributes: ["id", "nick"], }, }) .then((posts) => { res.render("index", { title: "NodeBird", twits: posts, user: req.user, loginError: req.flash("loginError"), }); }) .catch((err) => { console.error(err); next(err); }); }); module.exports = router; index pug 파일입니다. extends layout block content .timeline if user div form#twit-form(action='/post' method='post' enctype='multipart/form-data') .input-group textarea#twit(name='content' maxlength=140) .img-preview img#img-preview(src='' style='display: none;' width='250' alt='미리보기') input#img-url(type='hidden' name='url') div label#img-label(for='img') 사진 업로드 input#img(type='file' accept='image/*') button#twit-btn.btn(type='submit') 짹짹 .twits form#hashtag-form(action='/post/hashtag') input(type='text' name='hashtag' placeholder='태그 검색') button.btn 검색 for twit in twits .twit input.twit-user-id(type='hidden' value=twit.user.id) input.twit-id(type='hidden' value=twit.id) .twit-author= twit.user.nick -const follow = user && user.Followings.map(f => f.id).includes(twit.user.id); if user && user.id !== twit.user.id && !follow button.twit-follow 팔로우하기 .twit-content= twit.content if twit.img .twit-img img(src=twit.img alt='섬네일') script. if (document.getElementById('img')) { document.getElementById('img').addEventListener('change', function (e) { var formData = new FormData(); console.log(this, this.files); formData.append('img', this.files[0]); var xhr = new XMLHttpRequest(); xhr.onload = function () { if (xhr.status === 200) { var url = JSON.parse(xhr.responseText).url; document.getElementById('img-url').value = url; document.getElementById('img-preview').src = url; document.getElementById('img-preview').style.display = 'inline'; } else { console.error(xhr.responseText); } }; xhr.open('POST', '/post/img'); xhr.send(formData); }); } document.querySelectorAll('.twit-follow').forEach(function (tag) { tag.addEventListener('click', function () { var isLoggedIn = document.querySelector('#my-id'); if (isLoggedIn) { var userId = tag.parentNode.querySelector('.twit-user-id').value; var myId = isLoggedIn.value; if (userId !== myId) { if (confirm('팔로잉하시겠습니까?')) { var xhr = new XMLHttpRequest(); xhr.onload = function () { if (xhr.status === 200) { location.reload(); } else { console.error(xhr.responseText); } }; xhr.open('POST', '/user/' + userId + '/follow'); xhr.send(); } } } }); });

1
공개되지 않은 강의로
수강이 제한됩니다.
지식공유자 : 조현영
총 145개 수업˙총 24시간 24분
평생 무제한 수강
수료증 발급 강의
초급 대상
이 강의는 멘토링 신청이 가능합니다.
멘토링은 수강 신청과 별개로 운영되며, 수강생이 아니어도 신청할 수 있습니다.
수강 전 궁금한 점이 있나요?
문의하기
문의
지식공유자 되기
많은 사람들에게 배움의 기회를 주고,
경제적 보상을 받아보세요.
지식공유참여
기업 교육을 위한 인프런
“인프런 비즈니스” 를 통해 모든 팀원이 인프런의 강의들을
자유롭게 학습하는 환경을 제공하세요.
인프런 비즈니스