수강이 제한됩니다.
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
파로잉 팔로워 질문드립니다.
db.User.hasMany(db.Post); 이부분에서 db.User.haMany(db.Post,{foreignKey:'id' , sourceKey:'id'}) 라고 생각해도되나여? 저거 생략된건가요? db.User.belongsToMany(db.User, { foreignKey: 'followingId', as: 'Followers', through: 'Follow', }); db.User.belongsToMany(db.User, { foreignKey: 'followerId', as: 'Followings', through: 'Follow', }); 여기서 User 테이블 id 와 follow의 follwingid 과 연결 user 테이블 id와 followerId와 연결로 생각해도 될까여? 근데 여기서 as는 설정을 해주는 이유가 헷갈릴까봐 정확한 명칭을 적어주는거라고 생각해도 될까요?
- 해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
app.set 질문
안녕하세요. 강의를 듣다가 궁금해졌는데, app.set('port', 3000); 작성 후 app.listen(app.get('port')를 해 주는 것과 const port = 3000; 선언 후 app.listen(port) 해 주는 것 중 어떤 게 더 좋은(?) 방법일까요? 둘 다 돌아가긴 돌아가는데 전자가 어디에서든 사용할 수 있기 때문에 더 선호된다거나 하는지 궁금합니다.
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
블로그 포스팅관련 문의
안녕하세요, 제로초님의 인강을 보면서 공부중인 수강생입니다! 블로그 포스팅에 관련 문의가 있어 질문 납깁니다. 공부한 내용을 블로그에 포스팅하면서 기록을 하고싶은데 혹시 불쾌하실 수 있을것같아 문의드립니다. 포스팅 내용은 코드, 해설해주시는 내용을 위주로 정리해서 올리려고합니다. 실례되는 질문드려서 죄송합니다. 또, 질 좋은 강의 감사합니다!
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
mysql referenced error 관련 질문 드립니다.
mysql> CREATE TABLE nodejs.comments ( -> id INT NOT NULL AUTO_INCREMENT, -> commenter INT NOT NULL, -> comment VARCHAR(100) NOT NULL, -> created_at DATETIME NOT NULL DEFAULT now(), -> PRIMARY KEY(id), -> INDEX commenter_idx (commenter ASC), -> CONSTRAINT commenter -> FOREIGN KEY (commenter) -> REFERENCES nodejs.users (id) -> ON DELETE CASCADE -> ON UPDATE CASCADE) -> COMMENT = '댓글' -> DEFAULT CHARSET=utf8mb4 -> ENGINE=InnoDB; 안녕하세요 맥에서 강좌의 내용처럼 테이블을 생성할때 ERROR 1824 (HY000): Failed to open the referenced table 'users' 라는 에러가 표시되면서 생성이 안되고 있는데 users가 없어서 참조할 수 없다는것 같은데 혹시 제가 놓친 부분이 있는건가요?
- 해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
res.send() === throw new Error() ???
항상 답변 달아주시는 조현영님께 감사 인사부터 드립니다. 라우터 메서드를 생성하고 조건에 따라 next("route")와 next()를 분기하였습니다. app.get( "/routing", (req, res, next) => { res.send("routing"); if (false) { next("route"); } else { next(); } }, (req, res) => { console.log("라우팅 실패"); } ); app.get("/routing", (req, res) => { console.log("라우팅 성공"); }); 조건문이 false인 상태로 next()함수로 바로 다음에 있는 미들웨어가 실행되며 console.log("라우팅 실패")가 실행됩니다. 그런데 app.get( "/routing", (req, res, next) => { res.send("routing"); if (false) { next("route"); } else { next(); } }, (req, res) => { console.log("라우팅 실패"); throw new Error("에러 발생"); } ); 조건문 다음 미들웨어에 에러를 발생 시키는 코드를 추가하고 실행하면 Cannot set headers 에러가 발생합니다. 전에 올렸던 질문이랑 유사하죠. 제가 궁금한 것은 분명히 res.send()(res객체를 사용한 응답형태 메서드)를 두번 이상 사용하지 않았는데도 (전체 코드에서 get메서드로 "/routing"을 참조하는 코드는 없습니다.) 응답 객체를 두개 이상 사용한 효과가 throw new Error() 코드를 집어넣었더니 발생한다는 것이었습니다. throw new Error가 응답 객체(req)와 어떠한 관련이 있나요?
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
.listen
강의에서 8번째 줄에 그냥 .listen이 이해가 가질 않습니다. 보통 .이면 메소드?를 불러오는건데 어떤놈의 메소드(함수)인지 궁금합니다
- 해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
app.get(), app.use() 차이점
평범하게 express 모듈을 사용하여 서버 토대를 만들고 그안에서 미들웨어를 사용하고 있습니다. app.use("/about", (req, res, next) => { // "/about"에 대한 모든 요청이 들어 올 때 실행된다. console.log("about에서만 실행"); res.write("<h1>only in about</h1>"); res.write("of course"); res.end(); next(); }); app.get("/about/:id", (req, res) => { // 위에 있던 미들 웨어가 use로 사용되어서 res.send를 사용하면 요청을 두번 보내버리는 효과가 있어 오류가 난다. res.send(`<h1> ${req.params.id} </h1>`); }); 위에 상태로 실행하게 되면 Cannot set headers after they are sent to the client 오류가 나옵니다. 그러나 다시 아래와 같이 수정하면 app.get("/about", (req, res, next) => { // "/about"에 대한 모든 요청이 들어 올 때 실행된다. console.log("about에서만 실행"); res.write("<h1>only in about</h1>"); res.write("of course"); res.end(); next(); }); app.get("/about/:id", (req, res) => { // 위에 있던 미들 웨어가 use로 사용되어서 res.send를 사용하면 요청을 두번 보내버리는 효과가 있어 오류가 난다. res.send(`<h1> ${req.params.id} </h1>`); }); 코드가 정상 실행되며 /about/:id 경로에서 id값을 입력하면 res.send()함수에 id값이 잘 들어오게 됩니다. get과 use에 어떠한 차이점 때문에 이러힌 결과가 나오는 건지 궁금합니다.
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
async await관련 질문 드립니다.
async function A() { ... } // 3초 async function B() { ... } // 2초 const a = await A(); // (1) const b = await B(); // (2) 시간이 많이 소요 되는 비동기 함수 A, B 두개가 있을 때 위와 같이 호출하면 (1)에서 A호출해서 백그라운드로 넘겨주고 기다리다가 결과 받고 (2)에서 B호출해서 백그라운드로 넘겨주고 기다리다가 결과 받는다고 이해했습니다. 총 5초가 소요된다고 예상했습니다. 그렇게되면 백그라운드에서 js보다 빠른 c++등 으로 실행할 수 있다는 점 빼고 비동기를 사용하는 이유가 없다는 생각이 들었습니다. A와 B가 동기적으로 실행되기 때문입니다. async function A() { ... } // 3초 async function B() { ... } // 2초 const aPromise = A(); // (1) const bPromise = B(); // (2) const a = await aPromise; // (3) const b = await bPromise; // (4) 위와같이 (1)(2)에서 결과를 기다리지 않고 비동기함수를 백그라운드로 둘다 넘기면 A,B가 동시에 백그라운드에서 실행되기 때문에 총 3초가 소요된다고 예상했습니다. 제가 이해한 내용이 맞는지 궁금합니다. A, B의 순서가 상관 없다면 아래처럼 작성하는 것이 속도면에서 나은 코드인가요?
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
블로킹 === 동기 , 논 블로킹 === 비동기 이 개념이 헷갈려서 질문드립니다.
안녕하세요~ 제로초님 "노드의 특성" 강좌에서 논 블로킹과 동기를 같은 개념으로 그리고 블로킹과 비동기를 같은 개념으로 생각해도 무방하다고 하셨는데요. 제가 볼 때도, 둘은 같은 개념 같은데... 왜 블로킹과 비동기 같이 다른 이름으로 불리는 지 혼란스럽습니다. 보통 다른 이름으로 불려진다는 것은 매우 유사하면서도, 둘을 구분 지을 수밖에 없는 차이점이 있기 때문일텐데... "블로킹 vs 동기" 의 차이점과 "논 블로킹 vs 비동기" 의 차이점은 무엇인가요?? 아 그리고 내일이면, 연말인데 행복한 연말 보내시고, 2022년 새해 복도 많이 받으시기 바랍니다 :)
- 해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
미들웨어 관련 질문입니다.
조현영님 강좌를 보던 중 express와 미들웨어 관련된 강좌를 보고 express를 사용해 서버를 만들던 도중에 막히는 부분이 있어서 질문해봅니다. (단순 에러 해결 질문은 아닙니다.) const axios = require("axios"); const express = require("express"); const path = require("path"); const morgan = require("morgan"); const app = express(); const hostName = "127.0.0.1"; const port = process.env.PORT || 5147; require("./productServer1"); app.use(morgan("dev")); function getInfoWithAxios(key) { if (key === "1") { res.sendFile(path.join(__dirname, "./productOne.html")); } else if (key === "2") { res.sendFile(path.join(__dirname, "./productTwo.html")); } else { res.sendFile(path.join(__dirname, "./productThree.html")); } } app.set("func", getInfoWithAxios()); app.get("/", (req, res) => { res.sendFile(path.join(__dirname, "./expressAPI.html")); }); app.use("/product/:addr", (req, res, next) => { console.log(`you connect on ${req.params.addr}}`); next(); }); app.get("/product", (req, res) => { res.write("<h1>Here is product information</h1>"); res.send(); }); app.get("/product/product1", async (req, res) => { try { const result = await axios.get("http://127.0.0.1:3257"); const productID = String(result.data[0].id); app.get("func"); console.log("Request Type:", req.method); } catch (err) { console.error(err); } }); app.get("/product/product2", async (req, res) => { try { const result = await axios.get("http://127.0.0.1:3257"); const productID = String(result.data[1].id); app.get("func"); console.log("Request Type:", req.method); } catch (err) { console.error(err); } }); app.get("/product/product3", async (req, res) => { try { const result = await axios.get("http://127.0.0.1:3257"); const productID = String(result.data[2].id); app.get("func"); console.log("Request Type:", req.method); } catch (err) { console.error(err); } }); app.use((err, req, res, next) => { console.error(err); res.status(401).send(err.message); }); app.listen(port, () => { console.log(`server is running at http://${hostName}:${port}`); }); 위에 코드를 실행시키면 우선 코드 본문의 내용이 실행됨과 동시에 require()로 productServer1이라는 express를 사용한 상품 데이터 서버가 실행됩니다. (localhost를 사용하고 상품 데이터 서버 포트는 3257)입니다. /product/product(1~3)으로 get메서드를 보내면 같이 실행되는 상품 데이터 서버에서 id값을 받아오고 id값을 getInfoWithAxios(key)함수에 넣어서 html페이지를 id값에 맞게 상품별로 분기하게 됩니다. 이떄 문제는 getInfoWithAxios()함수에 res객체가 없어서 id에 맞게 html페이지를 분기 할 수가 없다는 것입니다. 미들웨어로 처리를 하고 싶지만 방법을 모르겠어서 질문해봅니다. 그리고 app.get() 함수에 있는 각각의 productID를 어떻게 하면 매개변수로 대입 할 수 있는지도 궁금합니다. 요약하자면 함수를 미들웨어로 만들려면 어떻게 작성해야 하고 만든 함수를 접근할때 매개변수는 어떻게 대입할수 있을까요? 조현영님의 이해를 돕기 위해서 전체 프로젝트에 대한 깃 주소를 남겨드리겠습니다. https://github.com/shere1765/node_server/tree/main/small_project 전체 프로젝트에 있는 expressAPI는 문제없이 잘 실행될겁니다. 하지만 제가 원하는 코드는 아닙니다. 그 밖에 문제점이 있다면 피드백 부탁드립니다.
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
상단에 댓글에서 아이디값이 코멘트 id값으로 들어갑니다.
댓글 등록에서 아이디칸이 코멘트의 id값으로 들어갑니다. sequelize.js 에서 comment.id 를 - > comment.user.id로 바꿔줘야 할것 같습니다.
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
질문드립니다.
꼭 저렇게 hasOne belongsTo로 걸어줘야하나요? 그냥 테이블만들고 사용하면 안되나여? 그리고 저희 뒷쪽 강의에서 시퀄라이즈로 계속해서 사용하는지 궁금합니다.
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
whatwg방식과 url객체
바닐라 자바스크립트에도 URL객체가 있던데,객체속성을 보니까 whatwg와 완전히 같더라고요. 둘이 같은놈이라고 보면 되죠?
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
TypeError: Assignment to constant variable.
const { Worker, isMainThread, parentPort, workerData, } = require("worker_threads"); const min = 2; // const max = 10_000_000; const primes = []; function findPrimes(start, range) { let isPrime = true; const end = start + range; for (let i = start; i < end; i++) { for (let j = min; j < Math.sqrt(end); j++) { if (i !== j && i % j === 0) { isPrime = false; break; } } if (isPrime) { primes.push(i); } isPrime = true; } } if (isMainThread) { const max = 10_000_000; const threadCount = 8; const threads = new Set(); const range = Math.ceil((max - min) / threadCount); let start = min; console.time("prime"); for (let i = 0; i < threadCount - 1; i++) { const wStart = start; threads.add( new Worker(__filename, { workerData: { start: wStart, range } }) ); } threads.add( new Worker(__filename, { workerData: { start, range: range + ((max - min + 1) % threadCount) }, }) ); for (let worker of threads) { worker.on("error", (err) => { throw err; }); worker.on("exit", () => { threads.delete(worker); if (threads.size === 0) { console.timeEnd("prime"); console.log(primes.length); } }); worker.on("message", (msg) => { primes = primes.concat(msg); }); } } else { findPrimes(workerData.start, workerData.range); parentPort.postMessage(primes); } node:internal/event_target:777 process.nextTick(() => { throw err; }); ^ TypeError: Assignment to constant variable. at Worker.<anonymous> (/Users/itaewon/Documents/devsource/node_test/prime-worker.js:60:14) at Worker.emit (node:events:390:28) at MessagePort.<anonymous> (node:internal/worker:232:53) at MessagePort.[nodejs.internal.kHybridDispatch] (node:internalevent_target:562:20) at MessagePort.exports.emitMessage (node:internal/per_context/messageport:23:28)
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
app.use 질문드립니다.
app.use 미들웨어도 주소를 정해줄수 있다고 하였는데 그럼 맨처음 localhost:3000/app.css get요청이 들어왔을때 여기서 /app.css 인데 app.use('/',express.static(path.join(__dirname,'public'))); '/' 에서 걸리는 이유가 궁금합니다.
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
쿠키질문드립니다.
res.cookie('name',encodeURIComponent(name),{ expires:new Date(), httpOnly:true, path:'/', }) 여기서 이 name 변수는 예전이랑 똑같이 const url = require('url'); const qs = require('querystring'); 이걸로 const { query } = url.parse(req.url); const { name } = qs.parse(query); 이런식으로 받아야하는건가요?? 여기서는 변경된사항이 없는건가요?
- 해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
코드 적용을 위해 껐다 켜는 것 질문
코드 적용을 위해 껐다가 켜야 한다는 게 vscode 자체를 껐다가 켜야 한다는 소리인가요? 아니면 클라이언트? 브라우저?를 껐다가 켜야 하는 건가요?
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
app.use 메소드 인수 질문드립니다.
기본적으로 app.use('',()=>{})이런식으로 주소 , 콜백함수로 쓸수있다고 하셨는데 그러면 app의 use 메소드에서 use : (a,b)=>{ typeof(a) } 이런식으로 타입이 먼지 확인하고 함수가 들어오는지, string이 들어오는지에 따라 다르게 동작하는건가요? app.use(()=>{}); 이런식으로 주소 생략가능하다고 하셔서요
- 해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
db json 출력 문의 드립니다.
안녕하세요 ( _ _ ) 백엔드에서 프론트로 fetch (get)을 통해 아래 json을 가져왔습니다 [{"user":[{"_id":32,"sum":1},{"_id":33,"sum":11},{"_id":34,"sum":8},{"_id":35,"sum":5},{"_id":36,"sum":12},{"_id":37,"sum":8},{"_id":38,"sum":3},{"_id":39,"sum":13},{"_id":40,"sum":14},{"_id":41,"sum":15},{"_id":42,"sum":4},{"_id":43,"sum":14}], "all":[{"_id":32,"sum":3},{"_id":33,"sum":13},{"_id":34,"sum":16},{"_id":35,"sum":15},{"_id":36,"sum":14},{"_id":37,"sum":10},{"_id":38,"sum":3},{"_id":39,"sum":16},{"_id":40,"sum":18},{"_id":41,"sum":17},{"_id":42,"sum":10},{"_id":43,"sum":15}]}] 이를 배열에 저장을 하려고 하는데 res.user._id res.user.sum res.all._id res.all.sum 위 4가지 값을 별도로 배열에 저장을 하고 싶은데 방법이 있을까요 ?
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
nodemon 질문드립니다.
지금 제 apchage.json 파일 상황입니다. { "name": "npmtest-3080", "version": "0.0.1", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "hee", "license": "MIT", "dependencies": { "express": "^4.17.2" }, "devDependencies": { "nodemon": "^2.0.15" } } nodemon을 npm i -D nodemon 으로 설치를해서 npx nodemon app 으로 실행을 하였습니다. 그런데 nodemon starting 'node app index.js'로 가는데 이유를 모르겠습니다. 중간에 mian : index.js 빼고해도 그대로입니다.