묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
nodebird 프로필 수정 기능 구현 시, 에러가 발생했을 때 에러처리미들웨어에서 res.render('error')가 안되는 상황
프로필 수정 기능을 구현하기 위한 profileUpdate.html{% extends 'layout.html' %} {% block content %} <div class="timeline"> <form id="profile-update-form"> <!-- <div class="input-group"> <label for="join-email">이메일</label> <input id="join-email" type="email" name="email" /> </div> --> <div class="input-group"> <label for="join-nick">닉네임</label> <input id="join-nick" type="text" name="nick" /> </div> <div class="input-group"> <label for="join-password">비밀번호</label> <input id="join-password" type="password" name="password" /> </div> <button id="join-btn" type="submit" class="btn">수정</button> </form> </div> {% endblock %} {% block script %} <script src="https://unpkg.com/axios/dist/axios.min.js"></script> <script> window.onload = () => { const errorParam = new URL(location.href).searchParams.get('error'); if (errorParam) { alert(errorParam); } }; if (document.getElementById('profile-update-form')) { document.addEventListener('submit', async (event) => { event.preventDefault(); const formData = new FormData(event.target); const config = { headers: { 'content-type': 'application/json', }, }; axios .put('/profile/update', formData, config) .then((res) => { alert('프로필 정보가 수정되었습니다.'); window.location.href = '/profile'; }) .catch((error) => { alert(error); }); }); } </script> {% endblock %} 그리고 controller/page.jsexports.renderProfileUpdate = (req, res, next) => { res.render('profileUpdate', { title: '내 정보 수정 - NodeBird' }); }; exports.profileUpdate = async (req, res, next) => { try { const { nick, password } = req.body; const id = req.user.id; const exUser = await User.findOne({ where: { id } }); if (!exUser) { throw new Error('존재하지 않는 사용자입니다.'); // res.status(404).send('no user'); } const sameNickUser = await User.findOne({ where: { nick, id: { [Op.ne]: exUser.id, }, }, }); if (sameNickUser) { throw new Error('중복된 닉네임입니다.'); // res.status(501).send('중복된 닉네임입니다.'); } const hash = await bcrypt.hash(password, 12); exUser.set({ nick, password: hash, }); await exUser.save(); res.status(201).send(); } catch (error) { console.error(error); next(error); } };app.js의 에러처리 미들웨어app.use((err, req, res, next) => { // 404 다음은 에러처리 미들웨어 console.error('에러는 ', err.message); res.locals.message = err.message; res.locals.error = process.env.NODE_ENV !== 'production' ? err : {}; // 보안상 위험(오히려 배포 시 사용자 화면에 에러를 숨김) // 에러를 로깅 서비스에 넘김 res.status(err.status | 500); res.render('error'); // views/error.html });일부러 중복된 닉네임을 넣어 라우터에서 에러를 발생시켰을 때, 에러처리미들웨어의 console.error('에러는 ', err.message); 부분에서 "Error: 중복된 닉네임입니다. at exports.profileUpdate (/nodestudy/nodebird/controllers/page.js:31:13) at process.processTicksAndRejections (node:internal/process/task_queues:95:5)에러는 중복된 닉네임입니다.PUT /profile/update 500 10.568 ms - 1862" 로 에러 메시지가 정상적으로 찍히는 것을 확인하였습니다.preview 탭에선 정상적으로 나오는 것 같은데, 실제 브라우저 화면에선 위와 같이 뜨면서 제가 원하는 에러 메시지('중복된 닉네임입니다')가 alert 창에 뜨지 않으며, error.html이 렌더링도 되지 않고 있습니다. 구글링해봐도 제가 잘 못한건지 이유를 못찾겠습니다🥲 제가 뭘 놓친걸까요?
-
해결됨[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
sequelize 대신 mongoose를 사용하는 이유
12장 프로젝트는 sequelize로도 구현이 가능할 텐데, seqeulize 대신 mongoose를 사용하신 이유가 궁금합니다. mongoose를 사용하는 것이 더 좋은 성능을 보이나요?
-
미해결[리뉴얼] 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 교과서 3판 질문드립니다
[제로초 강좌 질문 필독 사항입니다]질문에는 여러분에게 도움이 되는 질문과 도움이 되지 않는 질문이 있습니다.도움이 되는 질문을 하는 방법을 알려드립니다.https://www.youtube.com/watch?v=PUKOWrOuC0c0. 숫자 0부터 시작한 이유는 1보다 더 중요한 것이기 때문입니다. 에러가 났을 때 해결을 하는 게 중요한 게 아닙니다. 왜 여러분은 해결을 못 하고 저는 해결을 하는지, 어디서 힌트를 얻은 것이고 어떻게 해결한 건지 그걸 알아가셔야 합니다. 그렇지 못한 질문은 무의미한 질문입니다.1. 에러 메시지를 올리기 전에 반드시 스스로 번역을 해야 합니다. 번역기 요즘 잘 되어 있습니다. 에러 메시지가 에러 해결 단서의 90%를 차지합니다. 한글로 번역만 해도 대부분 풀립니다. 그냥 에러메시지를 올리고(심지어 안 올리는 분도 있습니다. 저는 독심술사가 아닙니다) 해결해달라고 하시면 아무런 도움이 안 됩니다.2. 에러 메시지를 잘라서 올리지 않아야 합니다. 입문자일수록 에러메시지에서 어떤 부분이 가장 중요한 부분인지 모르실 겁니다. 그러니 통째로 올리셔야 합니다.3. 코드도 같이 올려주세요. 다만 코드 전체를 다 올리거나, 깃헙 주소만 띡 던지지는 마세요. 여러분이 "가장" 의심스럽다고 생각하는 코드를 올려주세요.4. 이 강좌를 바탕으로 여러분이 응용을 해보다가 막히는 부분, 여러 개의 선택지 중에서 조언이 필요한 부분, 제 경험이 궁금한 부분에 대한 질문은 대환영입니다. 다만 여러분의 회사 일은 질문하지 마세요.5. 강좌 하나 끝날 때마다 남의 질문들을 읽어보세요. 여러분이 곧 만나게 될 에러들입니다.6. 위에 적은 내용을 명심하지 않으시면 백날 강좌를 봐도(제 강좌가 아니더라도) 실력이 늘지 않고 그냥 코딩쇼 관람 및 한컴타자연습을 한 셈이 될 겁니다. 선생님 안녕하세요3판이 출간된 걸로 아는데, 혹시 리뉴얼 강의도 출시하시는지 문의드리고 싶습니다그리고 REACT에 관심이 있으면웹게임을 만들며 배우는 react -> react nodebird 순으로 들으면 될까요?
-
해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
시퀄라이즈 연결질문...
require('dotenv').config(); const PORT = process.env.PORT; const dotenv = require('dotenv'); const express = require('express'); const compression = require("compression"); const methodOverride = require("method-override"); const cors = require("cors"); const userRouter = require("./routes/userRoute"); const boardRouter = require("./routes/boardRoute"); const authRouter = require('./routes/auth'); // 인증 라우터 const ejsMate = require('ejs-mate'); const path = require('path'); const session = require('express-session'); const morgan = require('morgan'); const nunjucks = require('nunjucks'); const passport = require('passport'); const passportConfig = require('./passport'); const { sequelize } = require('../models/index'); const cookieParser = require('cookie-parser'); const app = express(); passportConfig(); nunjucks.configure('views', { express : app, watch : true, }); sequelize.sync({ force: true }) .then(() => { console.log("데이터 베이스 연결 성공") }) .catch((err) => { console.log(err); }); app.engine('ejs', ejsMate) app.set('view engine', 'ejs'); app.set('views', path.join(__dirname, 'views')) app.use(express.urlencoded({ extended: true })); app.use(compression()); app.use(express.json()); app.use(express.urlencoded({extended:true})); app.use(methodOverride()); app.use(cors()); app.use(cookieParser(process.env.COOKIE_SECRET)); app.use( session({ resave: false, saveUninitialized: false, secret: process.env.COOKIE_SECRET, cookie: { httpOnly: true, secure: false, }, }), ); //! express-session에 의존하므로 뒤에 위치해야 함 app.use(passport.initialize()); // 요청 객체에 passport 설정을 심음 app.use(passport.session()); // req.session 객체에 passport정보를 추가 저장 // passport.session()이 실행되면, 세션쿠키 정보를 바탕으로 해서 passport/index.js의 deserializeUser()가 실행하게 한다. app.use('/', userRouter); app.use('/', boardRouter); app.use('/auth', authRouter); app.get('/', (req,res)=>{ res.render('home') }) app.listen(PORT, () => { console.log(`SERVING ON THE ${PORT}`); }) module.exports = app;<env파일>DB_HOST = localhostDB_USER = rootDB_PASS = tkfkdgo12DB_NAME = nodejsPORT = 3000JWT_SECRET = softsquared_jwt_secret_key_07040014087COOKIE_SECRET = cookiesecretKAKAO_ID = bcb213727449d2b53039dcca5f541c02const Sequelize = require('sequelize'); const path = require('path'); const env = process.env.NODE_ENV || 'development'; const User = require('./user'); // config/config.json 파일에 있는 설정값들을 불러온다. // config객체의 env변수(development)키 의 객체값들을 불러온다. // 즉, 데이터베이스 설정을 불러온다고 말할 수 있다. const config = require('../config/config')[env] const db = {}; // new Sequelize를 통해 MySQL 연결 객체를 생성한다. const sequelize = new Sequelize(config.database, config.username, config.password, config) // 연결객체를 나중에 재사용하기 위해 db.sequelize에 넣어둔다. db.Sequelize = Sequelize; db.sequelize = sequelize; User.init(sequelize); // 모듈로 꺼낸다. module.exports = db; <models 폴더 내 index.js>const Sequelize = require('sequelize'); const path = require('path'); const env = process.env.NODE_ENV || 'development'; const User = require('./user'); // config/config.json 파일에 있는 설정값들을 불러온다. // config객체의 env변수(development)키 의 객체값들을 불러온다. // 즉, 데이터베이스 설정을 불러온다고 말할 수 있다. const config = require('../config/config')[env] const db = {}; // new Sequelize를 통해 MySQL 연결 객체를 생성한다. const sequelize = new Sequelize(config.database, config.username, config.password, config) // 연결객체를 나중에 재사용하기 위해 db.sequelize에 넣어둔다. db.Sequelize = Sequelize; db.sequelize = sequelize; User.init(sequelize); // 모듈로 꺼낸다. module.exports = db; <config.json>{ "development": { "username": "root", "password": "tkfkdgo12", "database": "nodejs", "host": "localhost", "dialect": "mysql" }, "test": { "username": "root", "password": null, "database": "database_test", "host": "127.0.0.1", "dialect": "mysql" }, "production": { "username": "root", "password": null, "database": "database_production", "host": "127.0.0.1", "dialect": "mysql" } } <오류메시지>비밀번호 설정도 다해줬는데 모르겠습니다 ㅠㅠ
-
미해결
sequelize cascade 옵션을 사용해서 delete 할때
안녕하세요.웹 프로젝트를 진행하면서 궁금한 점이 있어서 질문드립니다.mysql과 sequelize를 사용하며users 테이블과 contents 테이블이 1:N 관계를 가지고 있습니다.그래서 users 데이터를 delete 할 때 자식으로 묶인 contents 데이터들을cascade 옵션을 통해 같이 delete 시키고자 합니다.models/contents.jsmodels/users.js 이때 그냥 삭제시키는 게 아니라 users 테이블과 contents 테이블 모두paranoid 옵션을 통해 deletedAt을 생성시키고 삭제된 날짜를 찍히게 하고자 하는데현재 user를 delete 하면 user는 삭제가 되어 deletedAt이 잘 나오지만 content는 삭제가 되지 않아deletedAt이 나오지 않는 상황입니다.구글링을 통해 여러 방법을 시도해 보았지만 해결되지 않아 질문드립니다.hooks나 api를 사용하지 않고 cascade를 통해 자식 요소까지삭제되면서 deletedAt이 잘 나올 수 있는 효과적인 방법이 있을까요?
-
미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
sequelize 질문
안녕하세요~! 강의 잘들었습니다. 궁금한 것이 있는데요 강의에서는 sequelize models에서 테이블 정의를 해주고 생성해주면서 실습을 하는데요 혹시 workbench로 데이터베이스와 테이블을 미리 만들어 놓고(models에서 테이블 생성 x) sequelize로 workbench에서 만든 테이블을 가져오고 crud를 해줄 수 있나요>? 가능하면 방법 알고 싶습니다!
-
미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
api추가 질문입니다
api 추가 질문입니다. router.get('/search/:hashtag', async (req, res, next) => { try { const result = await request( req, `/posts/hashtag/${encodeURIComponent(req.params.hashtag)}`,// 문자를 UTF-8로 인코딩 ); res.json(result.data); } catch (error) { if (error.code) { console.error(error); next(error); } } }); 이 코드에서 :hashtag는 인코드 되어서 request함수에 넣었습니다. router.get('/posts/hashtag/:title', verifyToken, async (req, res) => { try { const hashtag = await Hashtag.findOne({ where: { title: req.params.title } }); if (!hashtag) { return res.status(404).json({ code: 404, message: '검색 결과가 없습니다', }); } const posts = await hashtag.getPosts(); return res.json({ code: 200, payload: posts, }); } catch (error) { console.error(error); return res.status(500).json({ code: 500, message: '서버 에러', }); } }); request함수는 헤더의 authorization에 토큰을 넣어서 이 라우터에 요청합니다. 그렇다면 이 코드의 :title 속성은 인코드된 문자열이지 않나요? Hashtag모델에 인코드된 문자열이 저장되는 것도 아니던데 왜 인코드된 문자열을 다시 디코드하지 않나요? const posts = await hashtag.getPosts(); return res.json({ code: 200, payload: posts, }); 또 Post에 있는 hashtag를 가져와 posts에 넣어서 json형식으로 출력했더니 이런 형태의 데이터가 나왔는데 Post모델에서 조건에 맞는 hashtag를 가져온것은 이해 했습니다. 그러나 PostHashtag테이블과 UserId컬럼은 왜 가져온것인가요? 혹시 관계 메서드 add set remove get에 대해 정확히 어떠한 인과관계가 나타는지 설명해주실수 있나요? 대충 느낌은 오지만 긴가민가 합니다 ㅜㅜ
-
미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
기 구축된 DBMS에서 ORM model을 생성할 수 있는지?
안녕하세요. 제로초님. 기 구축된 MySQL DBMS 스키마로부터 Sequelize model, 즉 js 소스 형태의 table model들을 생성하는 방법이 있습니까? 아니면, 기능 호환성을 100% 맞추기 어렵기 때문에, 사실상 수동으로 한땀 한땀 model 코딩을 해야 할까요? 이것은 아마도 legacy 시스템에서 db는 그대로 두고 프로그램 부분을 ORM 활용하는 것으로 재작업하는 프로젝트에서 요구되는 사항일 것 같습니다. 감사합니다.
-
해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
마지막 쓰레드는 range를 따로 계산하신 이유가 있나요?
threads.add(new Worker(__filename, { workerData: { start, range: range + ((max - min + 1) % threadCount) } })); for문에서 threadCount - 1 안 하고 threadCount 까지 반복하면 안 되는 이유가 있는지 궁금합니다. 마지막에 따로 빼면 range가 10000007까지로 되는거 같아서요.
-
미해결[리뉴얼] 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 교과서 - 기본부터 프로젝트 실습까지
fs.readFile 호출시 readFile 도 background 로 보내는 건가요?
const fs = require('fs') fs.readFile('/Users/joe/test.txt', 'utf8' , (err, data) => { if (err) { console.error(err) return } console.log(data) }) 관련 질문을 읽다가 readFile 도 background 로 간다는 뉘앙스가 느껴져서 질문해봅니다. readFile 함수 자체는 background 로 가진 않지만 파일 읽는 행위가 background 에서 진행되는 걸까요?
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
Post 정보에서 태그 정보를 같이 받아오려고 합니다..
안녕하세요 제로초님 노드버드 강좌를 보면서 열심히 공부 중이며 노드버드에서 배운 부분을 조금씩 응용해보려고 하는 중에 질문이 있어서 이렇게 글을 쓰게 되었습니다. 우선 수업과 동일하게 Post table, Tag table이 M:N 다대다 관계를 설정하여 PostTag 라는 테이블이 생성되었습니다. 이것을 이용해서 게시글(Post) 정보를 한번에 불러올때 각 게시글마다 존재하는 태그들도 같이 받아오고 싶습니다. 제가 시도한 방법으로는 findAll 에서 include를 이용해서 받아오려고 했지만 실패했습니다. 제가 설정한 관계와는 맞지 않는 코드의 형태로 에러 메세지가 나오는 것 같습니다. sql 쿼리문의 조인에 대해 지식이 부족하다고 생각하여 조인 부분을 찾아보고 공부를 해도 sequelize 로 어떤식으로 풀어가야 할 지 모르겠습니다 ㅠㅠ 먼저 테이블 정보 입니다. 제가 작성한 코드 부분입니다. 마지막으로 에러메세지 입니다
-
미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
.listen
강의에서 8번째 줄에 그냥 .listen이 이해가 가질 않습니다. 보통 .이면 메소드?를 불러오는건데 어떤놈의 메소드(함수)인지 궁금합니다
-
미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
시퀄라이즈 질문드립니다..
안녕하세요 강사님 ch7에 해당하는 Sequelize 실습에서 hasMany - belongsTo 를 테이블 이름에 칼럼 만바꿔서 테스트를해보니 다음과 같은 에러가 계속 발생하였습니다. 강의에서 users ----------- comments 관계처럼 kakao ------------ talk 로 같은 관계로 테스트하였습니다. 1. kakao.js const Sequelize = require('sequelize'); module.exports = class Kakao extends Sequelize.Model { static init(sequelize) { return super.init({ name : { type : Sequelize.STRING(20), allowNull : false, unique : true, }, job : { type : Sequelize.STRING(30), allowNull : true, }, sex : { type : Sequelize.STRING(2), // 남자,여자 allowNull : false, }, created_at : { type : Sequelize.DATE, allowNull : false, defaultValue : Sequelize.NOW, }, },{ sequelize, timestamps : false, // 강제로 createAt,updatedAt 칼럼 만들지 말아줘 undescored : false, // 스네이크 케이스로 사용할꺼야 modelName : 'Kakao', tableName : 'kakao', paranoid: false, charset: 'utf8', collate: 'utf8_general_ci', }); } static associate(db) { db.Kakao.hasMany(db.Talk, { foreignKey: 'nicName', sourceKey: 'id' }); } }; 2.talk.js const Sequelize = require('sequelize'); module.exports = class Talk extends Sequelize.Model { static init(sequelize) { return super.init({ talk : { type : Sequelize.STRING(100), allowNull : true, }, created_at : { type : Sequelize.DATE, allowNull : false, defaultValue : Sequelize.NOW, }, },{ sequelize, timestamps: false, modelName : 'Talk', tableName : 'talk', paranoid: false, charset: 'utf8mb4', collate: 'utf8mb4_general_ci', }); } static associate(db) { db.Talk.belongsTo(db.Kakao, { foreignKey: 'nicName', targetKey: 'id' }); } }; 3. index.js const Sequelize = require('sequelize'); const Kakao = require('./kakao'); const Talk = require('./talk'); // NODE_ENV가 정의되지않으면 개발모드! const env = process.env.NODE_ENV || 'development'; const config = require('../config/config')[env]; const db = {}; // DB ID PWD Config_File const sequelize = new Sequelize(config.database, config.username, config.password, config); db.sequelize = sequelize; db.Kakao = Kakao; db.Talk = Talk; console.log(sequelize); Kakao.init(sequelize); Talk.init(sequelize); Kakao.associate(sequelize); Talk.associate(sequelize); module.exports = db; 어떤차이가 있는걸까요..? 저는 db.Kakao.hasMany(db.Talk, { foreignKey: 'nicName', sourceKey: 'id' }); db.Talk.belongsTo(db.Kakao, { foreignKey: 'nicName', targetKey: 'id' }); 이두줄을 kakao는 테이블의 고유한 pk가 talk테이블에 많다.(칼럼으로서는 id) 즉 talk 테이블에서 nicName이라는 칼럼을 foreignkey으로 사용하겠다.(kakao의 id를 가지고서) 라고 생각했습니다.
-
미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
해당 코드를 실행했을때 어떤 문제점이 있을지 생각해보는 문제였습니다.. 어떤 문제가 발생할지 가늠이 안됩니다....
코드는 다음과 같습니다 해당 코드를받고 어떤 문제점이 생길 수 있는지 파악해보라 하셨는데... 모른채 넘어갔습니다. 혼자라도 알아보려고 노력했는데 잘 모르겠습니다. 도움을 주실 수 있을까요.. let number = 0; const times = 100; function sleep() { return new Promise((resolve) => setTimeout(resolve, Math.random() * 5)); } async function adder() { for (let i = 0; i < times; i++) { await sleep(); let read = number; read = read + 1; await sleep(); number = read; } } async function subber() { for (let i = 0; i < times; i++) { await sleep(); let read = number; read = read - 1; await sleep(); number = read; } } async function main() { console.log("Started with", number); await Promise.all([ adder(), subber(), ]); console.log("Ended with", number); } main() .then(() => console.log("All done")) .catch((err) => console.error(err));
-
해결됨[리뉴얼] React로 NodeBird SNS 만들기
sequelize migration에 대한 궁금증이 있습니다.
강사님 안녕하세요. 좋은 강의 덕분에 저만의 홈페이지를 부족한 실력이지만 운영하게 되었습니다. 1년전 html이 무엇인지도 몰랐던 제가 홈페이지를 운영하게 되다니 강사님의 강의가 얼마나 훌륭한지 알수 있다고 봅니다. 감사합니다. 제 질문은 mysql 데이터베이스를 운영하면서 새로운 테이블 또는 컬럼을 추가할 때 sequelize migration을 이용해야 한다고 들어서(기존 데이터를 보존하기 위해서) 공부를 하고 있고 적용을 해보았습니다. 잘 작동하기에 문제는 없는데 mysql workbench를 이용하는게 더 직관적이고 편해서 이쪽을 이용하는 편입니다. 혹시 migration을 꼭 이용해야만 하는 장점이 있을까요? 딱히 그런게 없다면 워크벤치를 계속 이용해도 괜찮을 까요?
-
미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
버퍼와 스트림의 차이
버퍼가 일정한 크기로 모아뒀다가 다 채워지면 전송하는 방식이고, 스트림은 일정한 크기의 데이터를 지속적으로 전달하는 방식이라고 이해했습니다. 그렇다면, 버퍼의 크기를 작게하면 스트림의 기능을 하고 스트림의 highWaterMark를 크게하면 버퍼와 같은 기능을 하는건가요??
-
미해결mongoDB 기초부터 실무까지(feat. Node.js)
몽고디비와 mysql을 연결할 수 있을까요?
운동관련 서비스를 만들면서 사용자가 작성한 운동종목만 따로 가져와서 포스팅하려고 하는데 이를 위해서 mysql과 몽고디비를 연결해서 사용하고자 합니다. mysql에서 사용자가 작성한 운동종목 데이터만 몽고디비로 가져올 수 있을까요? sequelize와 mongoose를 사용하여, 또는 두 개의 디비를 connection하는 방법이 궁금합니다.
-
해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
Sequelize raw query store procedure 질문입니다.
안녕하세요 강의 잘 수강하고 있습니다! sequelize raw query로 db 에 미리 작성했던 store procedure 을 호출은 불가능한가요? 구글링, 공식문서에도 찾아봤는데 안나와서 이렇게 질문드립니다! 또한 추가로 raw query 사용을 const [results, metadata] = await sequelize.query("call myTest()"); 위와 같이 작성하였더니 에러로 TypeError: Cannot read property 'query' of undefined 이런식의 에러가 발생하는데 따로 import를 { sequelize } 말고 해주어야 하나요?