수강이 제한됩니다.
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
socket.js 에서 referer로부터 roomId를 가져올 때
안녕하세요! 조현영님! 강의 감사히 잘 보고 있습니다. 조현영님 강의를 듣고 시퀄라이즈 말고 직접 쿼리를 이용해서 회원 간의 채팅을 구현해보고 있는데요.socket.js 에서 socket.request.headers.referer로부터 roomId를 가져오려고 합니다. 분명 강의에서도 그렇게 해서 제가 하고 있는 코드에서도 동일하게 사용했는데요,강의 코드에서는 referer가 잘 추출이 되는데 제가 작성한 것에는 referer가 undefined로만 뜹니다.referer로부터 roomId가 추출이 안되서 일단 숫자 1로 고정해놓고 실행시키면 채팅도 서로 잘 왔다갔다 하고 db에 저장도 잘 됩니다. 진짜 딱 referer로부터 roomId만 추출하면 되는데 이게 안됩니다.조현영님 강의 코드에서 console.log(socket.request.headers)를 하면 이렇게 referer가 잘 뜨는데제가 작성한 코드에서는 이런 식으로 referer 항목이 아예 없습니다. 이 둘의 차이라고 하면 connection 부분이 위에는 keep-alive이고 제꺼에는 upgrade 인데 이것이 문제인 걸까요?? 소켓을 이용한 방식에는 차이가 없고 mysql을 연결한 방식에만 차이가 있습니다(시퀄라이즈를 사용했는가 또는 mysql 모듈을 사용해서 직접 연결했는가). 도대체 무엇이 문제인 걸까요?? 며칠 째 이 문제를 해결하지 못하고 있습니다..도와주세요ㅠㅠㅠ (좀전에 다른 분 질문에서 댓글로 같은 질문을 간단하게 했을 때'이 부분은 유튜브에 있는 강좌12강(리뉴얼 개정3판)을 보세요. 현재 무료공개기간입니다. 최신버전으로 진행하고 있어 코드도 깔끔하고 에러도 없습니다.'라고 답변 주셨는데 해당 부분 강의를 유투브에서 찾지 못해서 다시 자세하게 질문 올렸습니다. ) 감사합니다!!
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
스트리밍 방식으로 대용량 파일 업로드 & 다운로드 관련 질문
먼저, 좋은 강의 제공해 주셔서 감사드립니다.아래와 같은 환경인 경우 스트리밍 방식으로 대용량 파일 업로드 & 다운로드 시스템을 어떤 식으로 구현 할 수 있을 까요?내용 : 대용량 파일 업로드 & 다운로드 시스템시스템: (서버 : node.js), (클라이언트 : React)질문 :3.1 파일을 서버에 업로드 시 React에서 어떤 식으로 file을 스트리밍 처리하여 보낼 수 있나요? 또한 보낸 스트리밍 데이터에 대해서 node서버에서는 어떤 식으로 파일을 s3나 서버 로컬 스토리지에 chuck단위로 저장 할 수 있나요? (강의에서 말씀주신 것처럼 대용량 파일인 경우는 받으면서 바로 스토리지에 저장해야 할 것 같은데, 어떤 식으로 구성할 수 있을 까요?) 3.2 파일을 클라이언트에서 다운로드시 node에서 스트리밍 chunk단위로 어떻게 보낼 수 있나요? Http API인 경우 한 응답에 대해서 여러 응답을 보내면 에러가 발생되지 않나요? 또한 React에서는 어떤 식으로 Chunk단위 데이터를 받아서 하나의 대용량 파일로 로컬 저장 할 수 있나요? (React에는 fs같은 저장 API가 없다고 하셨는데, 어떤 식으로 구성할 수 있을까요?) cf. 잘 모르는 부분들이 많아 질문에 두서가 없습니다. 키워드라도 말씀주시면 찾아보겠습니다.
- 해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
a[title] 질문드립니다
[제로초 강좌 질문 필독 사항입니다]질문에는 여러분에게 도움이 되는 질문과 도움이 되지 않는 질문이 있습니다.도움이 되는 질문을 하는 방법을 알려드립니다.https://www.youtube.com/watch?v=PUKOWrOuC0c0. 숫자 0부터 시작한 이유는 1보다 더 중요한 것이기 때문입니다. 에러가 났을 때 해결을 하는 게 중요한 게 아닙니다. 왜 여러분은 해결을 못 하고 저는 해결을 하는지, 어디서 힌트를 얻은 것이고 어떻게 해결한 건지 그걸 알아가셔야 합니다. 그렇지 못한 질문은 무의미한 질문입니다.1. 에러 메시지를 올리기 전에 반드시 스스로 번역을 해야 합니다. 번역기 요즘 잘 되어 있습니다. 에러 메시지가 에러 해결 단서의 90%를 차지합니다. 한글로 번역만 해도 대부분 풀립니다. 그냥 에러메시지를 올리고(심지어 안 올리는 분도 있습니다. 저는 독심술사가 아닙니다) 해결해달라고 하시면 아무런 도움이 안 됩니다.2. 에러 메시지를 잘라서 올리지 않아야 합니다. 입문자일수록 에러메시지에서 어떤 부분이 가장 중요한 부분인지 모르실 겁니다. 그러니 통째로 올리셔야 합니다.3. 코드도 같이 올려주세요. 다만 코드 전체를 다 올리거나, 깃헙 주소만 띡 던지지는 마세요. 여러분이 "가장" 의심스럽다고 생각하는 코드를 올려주세요.4. 이 강좌를 바탕으로 여러분이 응용을 해보다가 막히는 부분, 여러 개의 선택지 중에서 조언이 필요한 부분, 제 경험이 궁금한 부분에 대한 질문은 대환영입니다. 다만 여러분의 회사 일은 질문하지 마세요.5. 강좌 하나 끝날 때마다 남의 질문들을 읽어보세요. 여러분이 곧 만나게 될 에러들입니다.6. 위에 적은 내용을 명심하지 않으시면 백날 강좌를 봐도(제 강좌가 아니더라도) 실력이 늘지 않고 그냥 코딩쇼 관람 및 한컴타자연습을 한 셈이 될 겁니다. 선생님 안녕하세요구글링을 하다가 이해가 안되는 부분이 있어서 혹시 질문을 받아주시면 감사하겠습니다부트스트랩을 검색하다가 이런 코드를 봤습니다 $('.nav-tabs > li a[title]').tooltip(); $('.nav-tabs > li a[title]').tooltip();.nav-tabs 클래스를 가진 태그의 자식 태그 중 li 태그의자손 태그들 중 a태그의~ 까지는 해석했습니다 그런데 a[title] 에서 햇갈려서 구글링을 해봤습니다보통은 a[title="value"] 면 a태그 중 title 속성의 값이 value인 것으로 알고 있는데a[title]이면 어떻게 해석해야 하는 게 맞는지 궁금해서 질문을 드리게 되었습니다가르쳐주시면 정말 감사하겠습니다
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
리뉴얼 강의 및 공부 방법
좋은 강의 해주셔서 감사합니다. 강의 너무 잘 듣고 있습니다.조현영 선생님의 강의로 node에 처음 입문했고, 사이드 프로젝트와 강의를 같이 들으면서 실력을 키우고 있습니다.질문은 다음과 같습니다. 리뉴얼 강의와 현재 강의의 내용 차이는 어떤 부분에 있을까요?? 기존 강의를 들었더라도 리뉴얼 강의를 들어보는 것이 좋을까요?? 조현영 선생님처럼 뛰어난 실력을 위해서 이 강의가 끝나면 어떻게, 무엇을 공부를 하는 것이 좋을까요??추천해주시는 강의나 책 또는 공부 방법 이 있을까요?? 감사합니다!
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
jwt decode
제로초님, 안녕하세요?오늘 컴퓨터와 싸웠는데, 해결이 안되어 문의드립니다.token을 jwt.io에서 decode하면 { "sub": "aaaaaaaa-bbbb-cccc-dddd-example", "aud": "xxxxxxxxxxxxexample", "email_verified": true, "token_use": "id", "auth_time": 1500009400, "iss": "https://cognito-idp.ap-southeast-2.amazonaws.com/ap-southeast-2_example", "cognito:username": "anaya", "exp": 1500013000, "given_name": "Anaya", "iat": 1500009400, "email": "anaya@example.com" }이렇게 있습니다.https://aws.amazon.com/ko/premiumsupport/knowledge-center/decode-verify-cognito-json-token/ jwt-decode써서, import jwt_decode from "jwt-decode";var token = "eyJ0eXAiO.../// jwt token";const {given_name, cognito: username}= jwt_decode(token);을 하면, given_name은 값이 잘 나오는데 console.log('cognito', cognito) console.log('username', username) 둘 다 값을 추출해내지를 못합니다. 제가 코딩을 잘못한거지, jwt-decode에서 해당 부분을 지원안하는지 알려면 어떤 부분을 보아야 하는지 문의드립니다. 늘 강의 잘 듣고 있습니다. 고맙습니다.
- 해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
node.js 교과서 3판 질문드립니다
[제로초 강좌 질문 필독 사항입니다]질문에는 여러분에게 도움이 되는 질문과 도움이 되지 않는 질문이 있습니다.도움이 되는 질문을 하는 방법을 알려드립니다.https://www.youtube.com/watch?v=PUKOWrOuC0c0. 숫자 0부터 시작한 이유는 1보다 더 중요한 것이기 때문입니다. 에러가 났을 때 해결을 하는 게 중요한 게 아닙니다. 왜 여러분은 해결을 못 하고 저는 해결을 하는지, 어디서 힌트를 얻은 것이고 어떻게 해결한 건지 그걸 알아가셔야 합니다. 그렇지 못한 질문은 무의미한 질문입니다.1. 에러 메시지를 올리기 전에 반드시 스스로 번역을 해야 합니다. 번역기 요즘 잘 되어 있습니다. 에러 메시지가 에러 해결 단서의 90%를 차지합니다. 한글로 번역만 해도 대부분 풀립니다. 그냥 에러메시지를 올리고(심지어 안 올리는 분도 있습니다. 저는 독심술사가 아닙니다) 해결해달라고 하시면 아무런 도움이 안 됩니다.2. 에러 메시지를 잘라서 올리지 않아야 합니다. 입문자일수록 에러메시지에서 어떤 부분이 가장 중요한 부분인지 모르실 겁니다. 그러니 통째로 올리셔야 합니다.3. 코드도 같이 올려주세요. 다만 코드 전체를 다 올리거나, 깃헙 주소만 띡 던지지는 마세요. 여러분이 "가장" 의심스럽다고 생각하는 코드를 올려주세요.4. 이 강좌를 바탕으로 여러분이 응용을 해보다가 막히는 부분, 여러 개의 선택지 중에서 조언이 필요한 부분, 제 경험이 궁금한 부분에 대한 질문은 대환영입니다. 다만 여러분의 회사 일은 질문하지 마세요.5. 강좌 하나 끝날 때마다 남의 질문들을 읽어보세요. 여러분이 곧 만나게 될 에러들입니다.6. 위에 적은 내용을 명심하지 않으시면 백날 강좌를 봐도(제 강좌가 아니더라도) 실력이 늘지 않고 그냥 코딩쇼 관람 및 한컴타자연습을 한 셈이 될 겁니다. 선생님 안녕하세요3판이 출간된 걸로 아는데, 혹시 리뉴얼 강의도 출시하시는지 문의드리고 싶습니다그리고 REACT에 관심이 있으면웹게임을 만들며 배우는 react -> react nodebird 순으로 들으면 될까요?
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
passport와 jwt
강의에서는 session을 사용하고 있는데 만약 로그인을 jwt토큰으로 구현한다면session: false 옵션을 주고isLogginde와 isNotLogginedIn 미들웨어처럼 accessToken과 refreshToken에 대한 인증절차를 직접 작성해서미들웨어로 등록해주면 될까요?패스포트가 다양한 소셜 로그인 구현시 편리함을 주는건 알겠는데 jwt를 사용한다면 패스포트를 어떤 방식으로 사용해야 할 지 잘 모르겠습니다
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
리뉴얼 강의
안녕하세요, 오늘 강의를 구매했는데 리뉴얼 강의가 나온다고 해서요... 내일 (12/20) 바로 리뉴얼 강의가 새로 나오는건가요?? 이 강의를 환불하고 새로운 강의로 구매할지 고민됩니다.
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
혹시 Node.js 교과서 3판 이북은 언제 나오나요?
제로초님 안녕하세요. Node.js 교과서 3판이 출판되는 것을 알게되었는데요. 개인적으로 기대가 많이 됩니다. 저 혹시 이북은 언제 나올지 알 수 있을까요?
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
몽고디비 사용자도 MYSQL부분을 들어야 하나요???
안녕하세요 기본적인 자바스크립트 노드JS를 사용할줄 알고있습니다.기초부터 다시 다지려고 강의를 신청했는데 제가 몽고디비 이용하여 개발을 할 예정인데MYSQL부분을 필수적으로 들어야할가요??SQL부분을 안듣고 넘어가면 이해가 안가는 부분이 있는지 궁금합니다.
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
sql 쿼리 로그는 어떤 모듈이 작성하나요?
시퀄라이즈 실습하기 마지막즘에 말씀하신sql 쿼리 내용이 나오는 로그는 어떤 모듈이 로깅하는것인가요?production 환경에서도 로깅이 되는건가요?궁금합니다
- 해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
nunjucks res.render('error'); 작동을 안합니다.
안녕하세요. 강사님.현재 learn-sequelize MySQL 부분을 실습하고 있습니다.그런데 실습 과정중 이름(UNIQUE INDEX ) 을 중복되게 생성하여 일부러 오류를 일으켰으나error.html 페이지가 호출 되지 않고있습니다.사용자 생성 router 부분은router.route('/').get(async (req, res, next) => {try {const users = await User.findAll();res.json(users);} catch(err) {console.error(err);next(err);}}).post(async (req, res, next) => {try {const user = await User.create({name : req.body.name,age : req.body.age,married : req.body.married});console.log(user);res.status(201).json(user); // status 201 작성됨(생성됨) 뜻} catch(err) {console.error(err);next(err); // <== next(err) 로 전달하나 error.html을 호출하지 못함}});입니다.app.use((err, req, res, next) => { res.locals.message = err.message; res.locals.error = process.env.NODE_ENV !== 'production' ? err : {}; err.status = err?.status ?? 500; res.status(err.status); console.log('test'); //<== 로그는 찍힘 res.render('error');//error.html render안됨});res.render('error') 가 되지 않고 있습니다. 라우터 경로 테스트 결과app.use((req, res, next) => {const error = new Error(`${req.method} ${req.url} 라우터가 없습니다.`);error.status = 404;next(error);});라우터 경로 오류시에는 정상적으로 호출하는 것으로 보아 문제는 없는 것 같은데 원인을 찾지 못하고 있습니다.잘 부탁드립니다.-- 에러 로그는 다음과 같습니다. ---- users 테이블에 중복된 이름을 입력 하였을 때 오류 내용으로 500 에러로 보아error.html 호출이 되어야 하지만 호출이 되지 않고 있습니다.Executing (default): INSERT INTO users (`id`,`name`,`age`,`married`,`created_at`) VALUES (DEFAULT,?,?,?,?);Errorat Query.run (D:\nodeExer\node_exer1\learn-sequelize\node_modules\sequelize\lib\dialects\mysql\query.js:52:25)at D:\nodeExer\node_exer1\learn-sequelize\node_modules\sequelize\lib\sequelize.js:314:28at processTicksAndRejections (internal/process/task_queues.js:95:5)at async MySQLQueryInterface.insert (D:\nodeExer\node_exer1\learn-sequelize\node_modules\sequelize\lib\dialects\abstract\query-interface.js:308:21)at async User.save (D:\nodeExer\node_exer1\learn-sequelize\node_modules\sequelize\lib\model.js:2432:35)at async Function.create (D:\nodeExer\node_exer1\learn-sequelize\node_modules\sequelize\lib\model.js:1344:12)at async D:\nodeExer\node_exer1\learn-sequelize\routes\users.js:22:26 {name: 'SequelizeUniqueConstraintError',errors: [ValidationErrorItem {message: 'name_UNIQUE must be unique',type: 'unique violation',path: 'name_UNIQUE',value: 'aa',origin: 'DB',instance: [User],validatorKey: 'not_unique',validatorName: null,validatorArgs: []}],parent: Error: Duplicate entry 'aa' for key 'users.name_UNIQUE'at Packet.asError (D:\nodeExer\node_exer1\learn-sequelize\node_modules\mysql2\lib\packets\packet.js:728:17)at Execute.execute (D:\nodeExer\node_exer1\learn-sequelize\node_modules\mysql2\lib\commands\command.js:29:26)at Connection.handlePacket (D:\nodeExer\node_exer1\learn-sequelize\node_modules\mysql2\lib\connection.js:456:32)at PacketParser.onPacket (D:\nodeExer\node_exer1\learn-sequelize\node_modules\mysql2\lib\connection.js:85:12)at PacketParser.executeStart (D:\nodeExer\node_exer1\learn-sequelize\node_modules\mysql2\lib\packet_parser.js:75:16)at Socket.<anonymous> (D:\nodeExer\node_exer1\learn-sequelize\node_modules\mysql2\lib\connection.js:92:25)at Socket.emit (events.js:400:28)at addChunk (internal/streams/readable.js:293:12)at readableAddChunk (internal/streams/readable.js:267:9)at Socket.Readable.push (internal/streams/readable.js:206:10) {code: 'ER_DUP_ENTRY',errno: 1062,sqlState: '23000',sqlMessage: "Duplicate entry 'aa' for key 'users.name_UNIQUE'",sql: 'INSERT INTO users (`id`,`name`,`age`,`married`,`created_at`) VALUES (DEFAULT,?,?,?,?);',parameters: [ 'aa', '11', false, '2022-12-14 17:38:07' ]},original: Error: Duplicate entry 'aa' for key 'users.name_UNIQUE'at Packet.asError (D:\nodeExer\node_exer1\learn-sequelize\node_modules\mysql2\lib\packets\packet.js:728:17)at Execute.execute (D:\nodeExer\node_exer1\learn-sequelize\node_modules\mysql2\lib\commands\command.js:29:26)at Connection.handlePacket (D:\nodeExer\node_exer1\learn-sequelize\node_modules\mysql2\lib\connection.js:456:32)at PacketParser.onPacket (D:\nodeExer\node_exer1\learn-sequelize\node_modules\mysql2\lib\connection.js:85:12)at PacketParser.executeStart (D:\nodeExer\node_exer1\learn-sequelize\node_modules\mysql2\lib\packet_parser.js:75:16)at Socket.<anonymous> (D:\nodeExer\node_exer1\learn-sequelize\node_modules\mysql2\lib\connection.js:92:25)at Socket.emit (events.js:400:28)at addChunk (internal/streams/readable.js:293:12)at readableAddChunk (internal/streams/readable.js:267:9)at Socket.Readable.push (internal/streams/readable.js:206:10) {code: 'ER_DUP_ENTRY',errno: 1062,sqlState: '23000',sqlMessage: "Duplicate entry 'aa' for key 'users.name_UNIQUE'",sql: 'INSERT INTO users (`id`,`name`,`age`,`married`,`created_at`) VALUES (DEFAULT,?,?,?,?);',parameters: [ 'aa', '11', false, '2022-12-14 17:38:07' ]},fields: { name_UNIQUE: 'aa' },sql: 'INSERT INTO users (`id`,`name`,`age`,`married`,`created_at`) VALUES (DEFAULT,?,?,?,?);'}POST /users 500 52.768 ms - 785
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
질문있습니다.
시퀄라이즈를 사용할 경우 호환되는 DB와의 종속성에서 자유로워져Mysql에서 Mariadb로 교체하더라도 문제가 없는걸로 아는데요 궁금한점은시퀄라이즈의 raw query를 사용해도 교체에 문제가 없는건가요?검색해봐도 나오지 않아 여쭤봅니다
- 해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
multer 한글 파일 업로드시 파일명이 깨져요.
multer 로 한글 이미지를 올렸습니다.한글 이미지 명은 각각 '꽃1.jpg', '꽃2.jpg' 입니다.아래 req.files 로그에서보시면 한글명이 깨져서 나오는 데요. 한글명이 깨지지 않도록 할 수 있는 방법이 없을까요?req.files [Object: null prototype] {image1: [{fieldname: 'image1',originalname: 'ê½\x831.jpg',encoding: '7bit',mimetype: 'image/jpeg',destination: 'uploads/',filename: 'ê½\x8311670868094390.jpg',path: 'uploads\\ê½\x8311670868094390.jpg',size: 77675}],image2: [{fieldname: 'image2',originalname: 'ê½\x832.jpg',encoding: '7bit',mimetype: 'image/jpeg',destination: 'uploads/',filename: 'ê½\x8321670868094392.jpg',path: 'uploads\\ê½\x8321670868094392.jpg',size: 73716}]}
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
수업자료는 어디있나요?
수업 떄 보여주는 Ppt는 어디서 받을수있나요
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
질문 있습니디
안녕하세요 강사님 561~562쪽 socket.js의 axios요청실습하고 있는데요 마지막 문장에 DELETE /room/:id 라우터에서 req.user를 통해 요청자가 누구인지 확인할 수 있습니다 라고 되어 있는데요해당 라우터에서 req.user를 console로 확인해 보았는데 undefined라고 뜹니다
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
multer 사용시 file 외 name값은 못받나용?
const formData = new FormData(); formData.append('testimg', files[0]); formData.append('foldername', 'testfolder'); formData.append('key1', 'value1'); axios.post('/crm/arr_image', formData, { headers: { 'Content-Type': 'multipart/form-data' } }).then((res) => { console.log('성공~~~~~~~~~~~'); }).catch((err) => { console.log('에러입니다 에러'); console.error(err); }); const upload = multer({ storage: multer.diskStorage({ // 경로를 설정 destination(req, file, cb) { console.log(req); console.log(req.body); console.log(req.file); console.log(req.headers); console.log('원래 안찍히는거야? 왜 안찍혀?'); try { fs.readdirSync(`uploads/${req.body.foldername}`); } catch (error) { fs.mkdirSync(`uploads/${req.body.foldername}`); } cb(null, `uploads/${req.body.foldername}`); }, filename(req, file, cb) { //파일명 설정 const ext = path.extname(file.originalname); const filename = randomChracter(6); console.log(filename); cb(null, filename + Date.now() + ext); }, }), });안녕하세요! 질문 있습니다!강좌에서는 Multer 밖에다가 폴더를 체크하고 만들었었는데폴더 이름이 프론트의 input - value 값에 있어서 요청이 들어올때마다 체크를 해줘야 해서위처럼 만들었는데요! 이게 axios 를 사용 안하고 그냥 post 요청하면 폴더가 생성이 되는데formData 객체를 생성해서 name - value 값을 넣어줬는데multer 내 req.body 내에 아무것도 안찍히더라구요?? ㅠㅠ원래 이러는건가요? 아니면 코드상에 문제가 있는걸까요??formData.append('foldername', 'testfolder');요 값을 multer 내 req.body로 받을수는 없는걸까요? ㅠ
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
코드 중복 부분 질문드립니다.
제가 제로초님 강좌를 듣다가 코드 중복일 때 여기 참고하라고 말씀하신 것을 기억하는데 어느 강좌에서 말씀하셨는지 기억이 안납니다. 혹시 알려주실 수 있을까요? ㅠㅠ 아니면 어딜 참고하라고 말씀하신건지 기억하실까요?
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
api 만드는 이유 질문드립니다.
굳이 만들어봤자 큰 이득이 없는 것 같은데 만드는 이유가 궁금합니다.크롤링하면 서버가 과부하 걸릴 수 있어서 api를 제공한다고 말씀하셨는데 이것도 개발자가 크롤링을 고집하면 소용없지 않나요?api를 얼마나 사용하는지 통계도 낼 수 있다고 말씀하셨는데 이걸 나중에 어디에 사용하는지도 잘 모르겠습니다.만듦으로써 얻는 이득이 있을까요?
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
Strategy의 done에 대해 질문드립니다.
local의 경우,passport.use( new LocalStrategy( { usernameField: "email", // req.body.email passwordField: "password", // req.body.password }, async (email, password, done) => { try { const exUser = await User.findOne({ where: { email } }); if (exUser) { const result = await bcrypt.compare(password, exUser.password); if (result) { done(null, exUser); } else { done(null, false, { message: "비밀번호가 다릅니다." }); } } else { done(null, false, { message: "가입되지 않은 회원입니다." }); } } catch (e) { console.error(e); done(e); } } ) );에서 done이 실행되면,authRouter.post("/login", (req, res, next) => { passport.authenticate("local", (err, user, info) => { if (err) { console.error(err); return next(err); } if (!user) { return res.redirect("/login"); } return req.login(user, (err) => { if (err) { console.error(err); return next(err); } // 여기서 { id : 3, "connect.sid" : s%31241432525 }에 저장된 cookie를 브라우저로 보냄 return res.redirect("/"); }); })(req, res, next); });passport.authenticate의 콜백함수로 이동한다고 이해했습니다. oauth의 경우, passport.use( new KakaoStrategy( { clientID: process.env.KAKAO_ID, callbackURL: "/auth/kakao/callback", }, async (accessToekn, refreshToken, profile, done) => { try { const exUser = await User.findOne({ where: { snsId: profile.id, provider: "kakao" }, }); if (exUser) { done(null, exUser); } else { const newUser = await User.create({ email: profile._json && profile._json.kakao_account_email, nick: profile.displayName, snsId: profile.id, provider: "kakao", }); done(null, newUser); } } catch (e) { console.error(e); done(e); } } ) );에서 done이 실행되면 마찬가지로 done을 (err, user, info) => {} 와 같은 콜백방식으로 받아야 하지 않나요? 미들웨어 확장법을 사용하지 않고authRouter.get( "/kakao/callback", passport.authenticate( "kakao", { failureRedirect: "/login", }, (req, res) => { res.redirect("/"); } ) );방법이 가능한 이유가 궁금합니다.