수강이 제한됩니다.
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
강사님 get( ) 메소드 질문드립니다
강사님 안녕하세요 (()=>{ try{ const result = await axios.get('https://www.zerocho.com/api/get') console.log(result); console.log(result.data); } catch(error){console.error(error);} })(); get은 URL 뒤에 파라미터를 붙여 보내고,POST는 body에 데이터를 붙여 보낸다고 이해했습니다혹시, get이나 post는 프론트에서 사용하는 메서드고인자로 붙여주는 URL은 프론트에서 요청할 백엔드 서버의 URL 이라고 이해해도 되는지 질문드리고 싶습니다
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
readline 모듈에 대해서 문의드립니다.
제가 14강에서 처음 부분만 보고 readline 모듈을 사용해 node.js에서도 터미널 입력이 가능하다는 것을 알게되었습니다. 그런데 여기서 입력받는 값을 변수로 사용이 가능할까요? 파이썬에서는 아래 처럼 사용가능한 것으로 알고 있습니다. a = input("값 입력 : ") 자바스크립트로 알고리즘 공부하는것을 해보려하는데 알고리즘 공부를 할때 입력값을 자주 사용하더라구요. 그래서 readline 모듈 혹은 다른 방법으로 위에 파이썬 코드처럼 입력값을 변수로 사용할 수 있는 방법이 있다면 알려주시면 감사하겠습니다.
- 해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
강사님 2분 50초에 대해 질문드립니다
강사님 안녕하세요 강의 2분 50초에 보여주신 asysnc await 구문을 then 구문으로 변경하면 이렇게 변경할 수 있는지 질문드리고 싶습니다 PPT에서 보여주신 then 소스코드가 13행부터 보여주신 걸 수도 있는데, 혹시 제가 틀린 걸 수도 있어서 궁금해서 질문드립니다
- 해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
마지막 쓰레드는 range를 따로 계산하신 이유가 있나요?
threads.add(new Worker(__filename, { workerData: { start, range: range + ((max - min + 1) % threadCount) } })); for문에서 threadCount - 1 안 하고 threadCount 까지 반복하면 안 되는 이유가 있는지 궁금합니다. 마지막에 따로 빼면 range가 10000007까지로 되는거 같아서요.
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
module 관련 질문입니다!
제로초님의 var.js, func.js, index.js에서 func.js 파일에 console.log('func.js 파일') 한 줄을 추가했습니다. // func.js const { odd, even } = require('./var'); console.log('func.js 파일'); function checkOddOrEven(num) { if (num % 2) { // 홀수면(1 -> true) return odd; } return even; } module.exports = checkOddOrEven; 그리고 node index 를 실행해봤더니 index.js 파일에서 checkOddOrEven() 함수만 checkNumber에 할당되는 줄 알았는데 결과가 console.log('func.js 파일');도 같이 실행되네요...func.js 파일에 있는 checkOddOrEven() 함수 밖에 있는 console.log('func.js 파일') 까지 실행되는 이유가 궁금합니다!
- 해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
너무 어려워서 await 질문드리고 싶습니다
너무 어려워서 주말에 너무 많은 질문을 드리는 것 같아서 죄송합니다질문1. async/await 함수를 promise .then 으로 변환하려는데너무 어렵습니다 그림의 2단계부터 아예 막히는데강사님은 async/await 구문을 보시면바로 바로 promise.then 구문으로 어떻게 변환할지가 보이시는지그런 공식이 있는지 질문드리고 싶습니다 질문2. promise를 async로 변화시키는 것은 더 어려웠습니다그래서 처음 배우는 초심자의 입장에서는 궁금증이 생긴 게강사님께서는 1. 하나 하나 전부 일일이 수차례 디버깅 하시면서 오랜 시간을 들여 변경하시는지아니면 2. return 자리가 await이고, await ABC는 ABC.then( )이다 라는 공식 말고도그 외의 요소와 관련된 다른 공식들도 있는지 질문드리고 싶습니다무엇을 콜백의 인자로 바꿔줄 것인지어디에 콜백을 추가해줄 것인지아니면 이 부분은 좌변에 변수로 하나 만들어줄 것인지이런 판단을 하시는 근거를 배워야 저도 이해가 될 것 같아서요읽어주셔서 감사합니다
- 해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
await으로 변환하는 법 하나만 더 질문드립니다
주말에도 많은 질문을 받아주셔서 감사합니다promise에서 await 변환이 너무 어려워서 질문드리고 싶습니다 promise .then( ) 을 await으로 변환한 것을 가르쳐주신 부분을두 사진을 놓고 비교해봤습니다질문1.await은 then의 역할을 해주는데요그림 봐주시면 왼쪽은 then 하나인데요.then((user) => {user.name = 'zero'; return user.save(); })오른 쪽은 await이 2개입니다await users.findOne({ }); user.name = 'zero'await user.save( ); await user.save( );은user.save().then 으로는 변환이 안된 이유를 질문드리고 싶습니다질문2. promise then에서 async await으로 변환 예시를 보면콜백의 인자는 좌변의 변수로,어떤 리턴값은 wait으로 너무 간단하게 변환시키시는데요저는 처음 배우는 입장이다보니, 어떤 규칙이나 원리로 변환시키신건지 이해가 너무 어려워서 질문드리고 싶습니다await ABCDE 가ABCDE.then( ) 이라는 것까지는 이해해도나머지가 바뀌는 과정은 이해가 너무 어렵습니다 예를 들면 let user = await User.findOne({ }) 에서await 좌변에 있는 user가, .then( )에서는 콜백의 인자가 되는 과정이라던지 ..등등변환을 할 때 공식이 있는 것인지 아니면직접 디버깅을 수차례를 시도하시면서 수작업으로하나 하나 추측해가면서 변환해보고결과를 비교해보고 안되면 다르게 변환해보고이렇게 수작업으로 하신건지 궁금해서 질문드리고 싶습니다
- 해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
await 한번만 더 질문드리고 싶습니다
선생님 안녕하세요 await 한번만 더 질문드리고 싶습니다 아래의 소스코드에서 빨간색으로 표시한 async await을 promise .then로 바꿔봤습니다 2가지로 변환해봤는데, 둘다 에러가 생겨서 혹시 어떻게 변환시키는 게 올바른지 가르쳐주시면 감사하겠습니다아래는 소스코드입니다 function delayP(sec){ return new Promise( (resolve, reject) =>{ setTimeout(()=>{ resolve("10초 후, resolve()는 태스크큐로 갔다가 실행"); }, sec); } ); } async function myAsync(){ console.log("호출스택에 myAsync()가 쌓입니다") await delayP(10000).then((va)=>console.log(va)); return 'async' } myAsync().then((result)=>{console.log(result);}); console.log("전역 스코프의 함수 실행"); 읽어주셔서 감사합니다
- 해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
선생님 이어서 질문드리고 싶습니다
선생님 안녕하세요주말에도 많은 질문을 받아주셔서 정말 고맙습니다 지난 질문과 이어서 드리고 싶습니다await 질문드립니다 - 인프런 | 질문 & 답변 (inflearn.com) 타이머를 20초로 두고 async 구문을 가르쳐주신 promise 구문으로 바꿔주니 아..! 싶었던 게 호출스택을 전부 비워준 다음 20초 뒤에, 태스크큐의 resolve( )를 실행시켜줄 차례가 오면 이렇게 다시 resolve( )가 실행될 여건이 되도록필요한 호출스택들을 복원시켜주는 구조였군요!!!정말 감사합니다.. 그런데 궁금한 점이 있습니다setTimeout( )과 resolve( )는 왜 호출스택에서anonymous 라는 이름으로 쌓인건지 질문드리고 싶습니다
- 해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
await 질문드립니다
강사님 안녕하세요 await 과 비동기 콜백함수에 대해 질문드리고 싶습니다 function delayP(sec){ return new Promise( (resolve, reject) =>{ setTimeout(()=>{ resolve("Hello"); }, sec); } ); } async function myAsync(){ await delayP(10000) return 'async' } myAsync().then((result)=>{ console.log(result); }); console.log("Hello"); console.log("Hello2"); 이 소스코드를 봐주시면 await delayP(10000) 가 실행되기 전까지는 return 'async' 로 내려가지 못하도록 await이 기다려주는 기능을 알 수 있습니다 그러나 여기서 햇갈렸던 부분은 경과1. 경과2. 이렇게 됩니다태스크 큐에 있는 함수는 호출스택에서 함수들이 전부 비워질 때까지 기다려야 하는데 경과3. 호출스택의 함수들도 다 같이 멈춘 다음에await 과 관련된 호출 스택의 함수들은 전부 멈추고전역 스코프의 console.log( ) 함수들은 실행되었습니다 경과4. 호출스택이 안비워졌는데 태스크큐에 있는 함수가 실행되었습니다 저는 태스크큐에 있는 함수들은 호출스택이 비워져야 실행이 된다고 생각해왔어서await 이 이런 걸 가능하게 해주는 건지 질문드리고 싶습니다
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
anonymous에 대한 질문드립니다!
안녕하세요. 제로초님. 제가 초보여서 미숙한 질문일 수 있지만 궁금한 점이 생겨서 질문드립니다! 3:10초에 제로초님께서 자바스크립트 파일 마지막 줄까지 코드가 실행되면 anonymous가 사라지신다고 말씀하셨는데디버거 창으로 콜 스택 확인해보니깐 태스크 큐에서 run() 함수가 호출 스택 위로 올라가도 anonymous가 남아있는 것을 확인했습니다. 그래서 제로초님이 말씀대로 anonymous가 사라지는게 맞는지, 그리고 맞다면 저 anonymous는 어디서 온 건지 여쭤보고 싶습니다!
- 해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
시퀄라이즈를 이용해서 mysql id row 커스텀 하는방법
안녕하세요 조현영님 오랜만에 질문드립니다. mysql을 사용해서 crud에서 create를 하려는데 id 값을 0, 1, 2, 3, 4 ... 등에 자연수가 아닌 날짜 방식을 사용하려 합니다 예를 들면 아래와 같습니다. (name, price, origin, type 등은 req.body를 통해서 가져옵니다.) createdProduct = await Product.create({ id: Date.now().toString(), name, price, origin, type, }); 하지만 이 상태에서 create하게 되면 'Out of range value for column 'id' at row 1' 이런 에러가 나오게 됩니다. 구글에 검색해보니 datatype이 일치하지 않아 발생하는 에러라고 나옵니다. 그래서 저는 모델에 id row를 추가하고 생각이 들어 Product 모델에 다음과 같이 id row를 추가했습니다. id: { type: Sequelize.STRING(20), allowNull: false, unique: true, primaryKey: true, } 여기까지 했는데도 불구하고 같은 에러가 나옵니다. id row를 잘못 정의한것 일까요?
- 해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
promise.then().then() 질문드립니다
강사님 안녕하세요 호출 스택과 백그라운드 같이 그려보며 연습 중인데 promise.then().then() 을 보고 객체.함수().함수() 같다는 생각이 들었습니다 그런데 여기서 어려운 점이 var promise{ then : function(){ then : function(){ } } } 이런 형태라고 생각해도 되나요?함수 객체 안에속성으로 함수를 담을 수 있나요?이런 문법이 오류라고 나와서요이게 너무 햇갈려서호출 스택 쌓고 지우는 과정이 햇갈려서 질문드리고 싶습니다
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
type error 발생하는데 무엇이 문제인지 모르겠습니다..
(사진)
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
[템플릿엔진] 노드에서 View html을 작성할때, 퍼그/넌적스 쓰지않고 순수? html로 view 사용할 수 있나요?
안녕하세요, 정적인 프로젝트(html/css)만 해보다보니 퍼그/넌적스와 템플릿 엔진으로 html 작성이 조금 더딘데요,, 혹시, 노드 프로젝트 View, 템플릿 엔진(값)을 설정할때, 퍼그나, 넌적스 와 같은 템플릿 엔진을 말고, 일반?(순수) html 작성으로 view 템플릿 값을 설정할 수 있을까요? 보통은 '노드 html작성' 이라 검색을 하면 퍼그/넌적스 view 엔진 설정 설명이 많아서요, 어떤 키워드로 구글링을 하면 좋을까요, 어떻게 검색을 해, 퍼그방식이 아닌, 순수 html 파일 한개는 서빙 하는데 성공했는데요, 목표는 view폴더 안에 여러 폴더를 만들고, 계층구조에 맞게 다수 html/css를 보여주는 겁니다. 그래도 app.js에서 view 렌더 설정은 해야할꺼 같은데, 퍼그/넌적스는 아니고,,, 하지 않으면 퍼그를 써야하고ㅠ 저와 같은 상황과 희망사항이 가능한 내용일까요? 읽어주셔 감사합니다.
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
api status 질문드립니다
cat 에서 const tokenResult = await axios.post('http://localhost:8002/v1/token', { clientSecret: process.env.CLIENT_SECRET, }); 일부로 없는 client_secret으로 응답했을때 const domain = await Domain.findOne({ where: { clientSecret }, include: { model: User, attribute: ['nick', 'id'], }, }); if (!domain) { return res.status(401).json({ code: 401, message: '등록되지 않은 도메인입니다. 먼저 도메인을 등록하세요', }); } 여기서 domian null값찍히고 res.status(401).json으로 응답 받구 POST /v1/token 401 38.669 ms - 100 찍히는거 확인했습니다. GET /test 500 54.443 ms - 575 근데 여기서 500애러를 바로 떨궈버리는데 맞는건가요?? else { // 토큰 발급 실패 return res.json(tokenResult.data); // 발급 실패 사유 응답 } 여기가 언제걸리는지 궁금합니다. 그리고 cat에서 router.get('/test', async (req, res, next) => { // 토큰 테스트 라우터 try { if (!req.session.jwt) { // 세션에 토큰이 없으면 토큰 발급 시도 const tokenResult = await axios.post('http://localhost:8002/v1/token', { clientSecret: process.env.CLIENT_SECRET, }); if (tokenResult.data && tokenResult.data.code === 200) { // 토큰 발급 성공 req.session.jwt = tokenResult.data.token; // 세션에 토큰 저장 } else { // 토큰 발급 실패 return res.json(tokenResult.data); // 발급 실패 사유 응답 } } // 발급받은 토큰 테스트 const result = await axios.get('http://localhost:8002/v1/test', { headers: { authorization: req.session.jwt }, }); return res.json(result.data); } catch (error) { console.error(error); if (error.response.status === 419) { // 토큰 만료 시 return res.json(error.response.data); } return next(error); } }); 여기서 응답했을때 nodebirdapi에서 if(error.name == 'TokenExpiredError'){ return res.status(419).json({ code : 419, message:'토큰이 만료되었습니다.' }); } return res.status(401).json({ code : 401, message:'유효하지 않은 토큰입니다.' }); res.status.400번대인애들은 바로 catch에 걸리는건가요? return res.json(tokenResult.data); // 발급 실패 사유 응답 그럼 얘는 의미없는거 아닌가하고 질문드립니다.
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
[DBMS/ORM] 1:1 관계를 강제하는 주체
안녕하세요. 20세기 '선사시대'부터 프로그래밍을 한 사람입니다. 경력 단절이 있어서 늦은 때에 DBMS를 다시 보고 있고, 21세기 초반까지 없었던(제 기억에) ORM이라는 신세계를 경험하고 있습니다. MySQL 자체에서는 1:1 관계를 강제하는 방법은 두 테이블 중 FK를 가진 테이블에서, FK에 UNIQUE 제약을 거는 것으로 생각됩니다. 어디 문헌을 참조한 것이 아니라 제가 테스트를 해 본 결과 그렇다는 것입니다. Sequelize 모델 정의시 양 테이블에 각각 hasOne(), belongsTo()를 적어 1:1 관계를 정의하고 실행시켜 MySQL에 생성된 테이블을 조사해 보았는데 거기에는 FK에 UNIQUE 제약이 걸려 있지 않은 것을 확인했습니다. 이런 시험을 통해 저는, '1:1 관계를 강제하는 주체는 DBMS 가 아니라 ORM(Sequelize)이다'라는 결론을 내렸습니다. 저의 이러한 추론이 옳은 지, 특히 뭔가 오해하고 있는 부분이 있지는 않은지에 대해, Zeorcho님의 평가를 요청드립니다. 감사합니다.
- 해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
이벤트 리스너에서의 this에 대해 여쭙고 싶습니다
강사님 안녕하세요1. 7분에서button.addEventListener('click', function(){ concole.log(this.textContext); }); 에서의 this에 대해 질문드리고 싶습니다 이때 this가 햇갈린 이유는 다음과 같습니다2. 지난번에 드렸던 질문의 소스코드에서 var relationship1 = { name:'zero', friends : ['nero', 'hero', 'xero'], logFriends: function(){ var that = this; console.log(`this: ${this}, that: ${that}`); this.friends.forEach(function(friend){ console.log(that.name,friend); console.log(`this: ${this}, that: ${that}`); }); } } relationship1.logFriends(); 여기서 forEach 함수 내에 있는 콜백함수 funtion( ) 의 this는 호출되는 시점에 객체.function(friend){ console.log(that.name,friend); console.log(`this: ${this}, that: ${that}`); } 형식이 아닌 foreach( ) 호출 후에 콜백함수인 function( )이 단일로 호출이 되었기에 this가 window 라는 것을 이해했습니다 강의 7분 이벤트리스너에서의 this의 예시에서도 button.addEventListener('click', function(){ concole.log(this.textContext); });에서 button.function() 형식이 아닌 button.addEventListener( )가 호출된 다음 콜백함수로 function( ) 자체로만 호출이 되는건데 function( ) 안의 this가 window 가 아닌, button 을 가리키는 이유가 이해가 어려워서 질문드리고 싶습니다
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
nodebird 스스로 구현하기 동영상
9강 마지막 강좌에서 말씀하신 스스로 구현하기 유튜브 동영상(답안지) 이거 맞나요?
- 해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
프론트엔드의 로그인 페이지를 axios를 사용하여 구현한다면 응답 / 리다이렉션을 어떻게 처리해주는 것이 좋을까요?
이번 예제와 같이 로그인 페이지에서 HTML Form을 제출하도록 구현해보고 (잘 작동하였습니다), 앞의 예제와 같이 `axios.post`를 사용하여 POST 요청을 보내도록 구현도 해 보았는데, 후자의 경우 페이지가 리다이렉트 되지 않아서 원인을 알아보았습니다. (아래에 있습니다.) 혹시 현업에서는 이런 부분을 어떤 식으로 구현하나요? 구체적으로 1. 클라이언트에서 로그인 기능을 AJAX로도 구현하는지 궁금합니다. 2. 만일 AJAX로도 구현한다면 서버의 응답을 어떻게 처리하는지 궁금합니다. 서버의 응답 코드를 302로 하고 클라이언트의 axios에서는 302를 확인하려 했으나, 응답 코드 302가 확인이 안 되고, 리다이렉트된 주소의 응답이 결과값으로 반환됩니다. 그래서 응답에 문제가 없으면 `window.location`을 조정하여 브라우저를 리다이렉트하는 식으로 해결하였으나, 결과적으로 주소를 2번 요청하는 것도 조금 걸립니다. ===== 아래는 원인을 알아본 내용입니다. 타인에게 참고가 될까 싶어 첨부하였습니다. 서버에서 상태 코드가 302인 HTTP 응답을 보냈을 때, 클라이언트가 폼을 제출한 브라우저일 때는 브라우저가 응답을 받고 웹 페이지를 리다이렉션을 해주는 반면, 클라이언트가 Axios로부터 POST 요청을 보낸 경우였다면 리다이렉션 되는 것은 웹 페이지가 아닌 AJAX 요청입니다. 따라서 웹 페이지는 `/login`에 머물러 있고, AJAX 요청은 `/`로 리다이렉트되어서 응답 코드 200의 응답을 받고 이것이 `axios.post`의 결과로 반환됩니다. 참고한 자료: https://github.com/axios/axios/issues/396#issuecomment-395592900 (axios 문서 같은 곳에서는 관련 내용을 찾을 수 없어서 출처가 조금 빈약합니다. 혹시 틀린 내용이 있을 경우 지적해주시면 수정하겠습니다.)