수강이 제한됩니다.
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
mac 유저입니다
책에 추천해주신대로 homebrew로 설치 했는데추천해주신 5. 버전이 아닌 최신버전이 자동으로 깔렸습니다 ㅜ별 문제 없는지요
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
암호화모듈에 대해서 질문 남깁니다!
안녕하세요, 강의 잘 보고있습니다!!우선, 지금 제 노트북에서 bcrypt 모듈이 설치가 되지 않아서 노드 내장모듈 crypto를 사용해서 암호화를 했습니다. nodebird/libs/passwordHash.js 안에 만들어서 ("POST", "/join") passwordHash(password)로 DB에 저장하는 것 까지는 했습니다. 여기서 궁금한게 LocalStrategy 전략이 실행될 때try { const exUser = await User.find({where: {email: email}}); if(exUser) { const result = await bcrypt.compare(password, exUser.password); <-- 이부분 }저 부분을 crypto모듈을 사용할 경우 어떻게 바꿔야 할지 모르겠어서 이렇게 질문 남깁니다.감사합니다 :D
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
sns 서비스에서 다대다 관계에서 Sequelize 질문입니다.
위와 같이 다대다 관계로 Post 테이블과 Hashtag 테이블이 설정되어 있을 때,해당 Post를 삭제할 떄, Post.destory({where : { id : postId } }) 이런식으로 삭제는 되는데,그러면 Hashtag와의 관계도 자동으로 해제가 되고, PostHasttag 테이블에도 해당 row가 삭제가 되나요?아니면 수동으로 해당 게시글 삭제 전 관계를 해제해주는 작업을 우선적으로 하고 삭제해줘야하는 지,답변 기다리겠습니다
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
질문이 있씁니다!
if(req.url === '/') { return fs.readFile('./restFront.html', (err, data)=>{ if(err) { throw err; } res.end(data); }); } 그전에 예제에서는 return을 해주지 않았는데 이번에는 왜 전부 return으로 처리를 해주신건가요??
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
post method 사용시 /join 루트로 들어가면 어쩨서 /auth/join 으로 들어가게 되는 건가요?
auth.js 부분에서, router.post 부분에 대해 궁금한 게 있습니다. 이하의 코드에서 '/join' 어드레스와 post 메서드를 써서 접근을 했는데, 설명에는 이렇게 접근하면auth/join 으로 간다고 하셨습니다. 어째서 인가요?Get을 사용시에는 /join 했을 경우 /join으로 가는데, 이 경우에는 어떻게 알고 auth/join 으로 보내는 건가요? urlparser가 알아서 하는 건가요?router.post('/join', isNotLoggedIn, async (req, res, next)=>{ const {email, nick, password} = req.body; router.post 부분 코드 는 아래와 같습니다. router.post('/join', isNotLoggedIn, async (req, res, next)=>{ const {email, nick, password} = req.body; try{ const exUser = await User.find({where:{email}}); if(exUser){ req.flash('joinError', '이미 가입된 이메일입니다.'); return res.redirect('/join'); } console.time('암호화시간'); const hash = await bcryptjs.hash(password, 12); console.timeEnd('암호화시간'); await User.create({ email, nick, password: hash, }); return res.redirect('/'); }catch(error){ }})또한, router.post('./login' ~ 부분을 보면, (req, res, next) 등이 쓰이고, 그이후 다시 쓰이는데요, 동일한 변수들이 다시 붙는데요, 왜 인가요?클로져에서 이런 방식을 종종 보는데, 여기서는 아닌것 같고.시작하자 마자, 변수를 바로 입력해서 바로 실행하게 하기 위함인가요?코드는 아래와 같습니다. router.post('/login', isNotLoggedIn, (req, res, next)=>{ passport.authenticate('local', (authError, user, info)=>{ //erro, success, failure if(authError){ console.error(authError); return next(authError); } if(!user){ req.flash('loginError', info.message); return res.redirect('/'); } return req.login(user, (loginError)=>{ if(loginError){ console.error(loginError); return next(loginError); } }) })(req, res, next); // ******************** <<=== 이부분 입니다. })
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
jwt와 passport 연동에 대해서 질문드립니다.
제가 현재 프로젝트로 웹서버(서버 렌더링 없이)를 만들고 있는데,jwt를 이용해서 passport 인증으로 로그인 서비스를 구현하고 싶어요.강좌에서는 그런데 jwt와 passport를 한서버에서 같이 구현한 강의가 없어서 질문드립니다.제가 각 개념에 대해 이해가 부족한 탓인지,일단 jwt 토큰을 사용자에게 json으로 발급해주고 보내주는 것까진 구현했는데,passport 개념이 들어오니 감이 안잡히네요.구글링해서 jwt passport 연동에 관한 게시글을 살펴보았는데, 영문이기도 하고,이해하기 힘든 부분이 많은 것 같습니다.jwt를 이용해 passport 인증 기능을 구현한다면 어떤 흐름으로 코딩을 해야할지차근차근 명확하게 설명해주실 수 있으신가요?? ㅠㅠ
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
시스템 메시지 디비 저장에서 cookie-parser랑 cookie-signature를 import 하셔야 이 예제를 따라 할 수 있어요.
강의를 듣다보면 axios를 이용해서 cookie header 입력하는거에 포커스가 맞춰져 있습니다. 그래서 코드를 수정, 추가 한후 실행 할 때 TypeError: Cannot read property 'connect.sid' of undefined 에러가 나타나더라구요. 이 에러가 왜 나타나는지 보니까 cookieParser를 require 한 후 socketIO에서 사용하겠다는 걸 안넣어 줘서 그런건데 강의 특정 부분에 sessionMiddleware 설정위에 io.use((socket, next) => { cookieParser(process.env.COOKIE_SECRET)(socket.request, socket.request.res, next) }); 를 넣어주셔야 connect.sid 값을 읽을 수 있더라고요. 이거 때문에 꽤 오랜시간을 사용해가지고..ㅎㅎ 다른 분들은 이거로 너무 오래 고생하지마셔요! (제가 딴짓하느라 관련 소스를 놓쳤을 수도 있습니다)
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
restFront.html을 브라우져에 띄우면 에러가 나여 에러 내용은 Failed to load file:///C:/users: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https. 인데 이게 무슨 에러인가여?
restFront.html을 브라우져에 띄우면 에러가 나여 에러 내용은 Failed to load file:///C:/users: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.인데 이게 무슨 에러인가여?
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
팔로워와 팔로잉 관계 후 유저 라우터에서 함수 호출시 질문 있습니다.
유저 테이블을 다대다 관계로 Followers와 Followings를 정의 했는데왜 라우터 안에서는 addFollowings가 아닌 addFollowing함수가 생겼는 지 궁금합니다.(add,remove,get) + 정의된 이름 <= 관계 정의 후 왼쪽과 같은 함수가 만들어 지는 것이 아닌가요???-models/index.js//팔로워와 팔로잉 관계db.User.belongsToMany(db.User, {through : 'Follow', as : 'Followers', foreignKey: 'followingId'});db.User.belongsToMany(db.User, {through : 'Follow', as : 'Followings', foreignKey: 'followerId'});-routes/User.jsrouter.post('/:id/follow', isLoggedIn, async (req,res,next)=>{...await user.addFollowing(parseInt( req.params.id, 10 ));...}
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
강의 후반부에 page.js 파일에서의 질문 입니다.
설명하신 내용 중에 헛깔리는 부분이 있어서요Post.findAll해서 게시글 테이블에 게시글데이터 뿐만이 아니라 include를 통해 사용자 id와 nick도 가져온다라고 하셨는데 .then(posts)=>{...} posts안에 게시글 데이터와 사용자 데이터도 같이 가져온다는 뜻인지 아니라면 include를 통한 사용자 데이터는 어디에서 가져 오는지 잘 이해가 되지 않아서 질문드립니다.소스 코드page.jsrouter.get('/'(req,res,next)=>{Post.findAll({include : {model : User,attributes : ['id','nick']}}).then((posts)=>{res.render('main',{title: 'NodeBird',twits : posts,user : req.userloginError : req.flash('loginError'),}}....
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
카카로 로그인 버튼을 누르면 notNull Violation: user.email cannot be null 라는 에러 메시지를 받습니다.
이메일을 null로 입력하면 안된다는 이야기인데, 검색해보니 이제 카카오는 email을 기본제공하지 않고 있다고 하네요. 이점 때문인가요?실제로 mode/user.js 에서 email 부분의 allowNull 부분을 false 에서 true로 했더니 에러 메시지가 바뀌긴 했습니다.Field 'email' doesn't have a default value 이걸로요.카카오의 api 사용 문제인가요? 이하는 에러 전문입니다.SequelizeValidationError: notNull Violation: user.email cannot be nullat Promise.all.then (C:UsersinomoDesktopnode js 교과서snsnode_modulessequelizelibinstance-validator.js:77:15)at tryCatcher (C:UsersinomoDesktopnode js 교과서snsnode_modulesbluebirdjsreleaseutil.js:16:23)at Promise._settlePromiseFromHandler (C:UsersinomoDesktopnode js 교과서snsnode_modulesbluebirdjsreleasepromise.js:512:31)at Promise._settlePromise (C:UsersinomoDesktopnode js 교과서snsnode_modulesbluebirdjsreleasepromise.js:569:18)at Promise._settlePromise0 (C:UsersinomoDesktopnode js 교과서snsnode_modulesbluebirdjsreleasepromise.js:614:10)at Promise._settlePromises (C:UsersinomoDesktopnode js 교과서snsnode_modulesbluebirdjsreleasepromise.js:694:18)at Promise._fulfill (C:UsersinomoDesktopnode js 교과서snsnode_modulesbluebirdjsreleasepromise.js:638:18)at PromiseArray._resolve (C:UsersinomoDesktopnode js 교과서snsnode_modulesbluebirdjsreleasepromise_array.js:126:19)at PromiseArray._promiseFulfilled (C:UsersinomoDesktopnode js 교과서snsnode_modulesbluebirdjsreleasepromise_array.js:144:14)at Promise._settlePromise (C:UsersinomoDesktopnode js 교과서snsnode_modulesbluebirdjsreleasepromise.js:574:26)at Promise._settlePromise0 (C:UsersinomoDesktopnode js 교과서snsnode_modulesbluebirdjsreleasepromise.js:614:10)at Promise._settlePromises (C:UsersinomoDesktopnode js 교과서snsnode_modulesbluebirdjsreleasepromise.js:694:18)at _drainQueueStep (C:UsersinomoDesktopnode js 교과서snsnode_modulesbluebirdjsreleaseasync.js:138:12)at _drainQueue (C:UsersinomoDesktopnode js 교과서snsnode_modulesbluebirdjsreleaseasync.js:131:9)at Async._drainQueues (C:UsersinomoDesktopnode js 교과서snsnode_modulesbluebirdjsreleaseasync.js:147:5)at Immediate.Async.drainQueues [as _onImmediate] (C:UsersinomoDesktopnode js 교과서snsnode_modulesbluebirdjsreleaseasync.js:17:14)at runCallback (timers.js:696:18)at tryOnImmediate (timers.js:667:5)at processImmediate (timers.js:649:5)
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
코딩 스타일에 대해 질문 있습니다.
github의 models 안에 들어있는 코드들을 보면 아래와 같구요,a) module.exports = (sequelize, DataTypes) => ( -사이에 기타 코드들-)강좌중의 코드를 따라가 보면 아래와 같습니다.b) module.exports =((sequelize, DataTypes) =>{ -기타 코드들- })둘의 차이가 뭔가요?module.exports = variableName 과 같은 식으로 exports 하지 않은 특별한 이유가 있나요?b)의 형식으로 했을 때는 아래와 같은 에러 코드를 받았습니다. 아무래도 오타 때문이겠죠?C:UsersinomoDesktopnode js 교과서snsmodelsindex.js:16db.User.hasMany(db.Post);^TypeError: Cannot read property 'hasMany' of undefined이하는 에러를 받았을 때의 user.js의 코드 전문입니다. module.exports =((sequelize, DataTypes) =>{ sequelize.define('user', { email: { type: DataTypes.STRING(40), allowNull:false, unique:true, }, nick: { type: DataTypes.STRING(15), allowNull: false, }, password:{ type: DataTypes.STRING(100), allowNull: true, }, provider: { type: DataTypes.STRING(100), allowNull: false, defaultValue: 'local', }, snsId: { type: DataTypes.STRING(10), allowNull: true, } }, { timestamps: true, paranoid: true, })})
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
sequelize, Sequelize 둘다 인자로 주는 이유가 무엇인가요?
코드를 보면, sequelize와 Sequelize를 둘다 인자로 주는 부분이 있습니다.그러나, 어찌보면 둘다 require('sequelize')에서 온건데, 굳이 저렇게 하는 이유가 뭔가요?db.User = require('./user')(sequelize, Sequelize);db.Post = require('./post')(sequelize, Sequelize);이하는 코드 전문입니다. const Sequelize = require('sequelize');const env = process.env.NODE_ENV || 'development';const config = require('../config/config')[env];const db = {};const sequelize = new Sequelize( config.database, config.username, config.password, config,);db.sequelize = sequelize;db.Sequelize = Sequelize;db.User = require('./user')(sequelize, Sequelize);db.Post = require('./post')(sequelize, Sequelize);db.Hashtag = require('./hashtag')(sequelize, Sequelize);db.User.hasMany(db.Post);db.Post.belongsTo(db.User);db.Post.belongsToMany(db.Hashtag, { through: 'PostHashtag' });db.Hashtag.belongsToMany(db.Post, { through: 'PostHashtag' });db.User.belongsToMany(db.User, { foreignKey: 'followingId', as: 'Followers', through: 'Follow',});db.User.belongsToMany(db.User, { foreignKey: 'followerId', as: 'Followings', through: 'Follow',});db.User.belongsToMany(db.Post, {through:'Like'});db.Post.belongsToMany(db.User, {through:'Like'});module.exports = db;
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
rest API 질문이여
POST www.zerhocho.com/users 가 rest api 방식의 url 형식이라는 건가여?이런식으로 url을 날리면 POST(회원 가입) or PUT(전체 수정)or PATCH(부분 수정), DELETE(삭제), GET(회원 정보 얻어서 출력 ) 등등이런식의 권고 방식을 규정한 약속이 rest API 인가여?
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
res.writeHead 와 Location:'/', 은 무엇을 의미하나여?
'''res.writeHead(302, {Location : '/','Set-Cookie': name=${encodeURIComponent(name)}; Expires = ${expires.toGMTString()};HttpOnly; Path=/,})'''res.writeHead 와 Location:'/', 은 무엇을 의미하나여?알려주시면 감사여~! 좋은 하루 되세여~!
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
쿠키 parse 하는 문법이 어려워요
안녕하세여 강사님~! 강의를 듣다 어려운 부분이 있어서 질문 드립니다.쿠키 parse 하는 함수 문법이 어려워서 그런데여 코드 내용을 이해하지 않고그냥 복붙해서 써도 되는 부분인가여?const parseCookies = (cookie = '') =>cookie.split(';').map(v => v.split('=')).map(([k, ...vs]) => [k, vs.join('=')]).reduce((acc, [k, v]) => {acc[k.trim()] = decodeURIComponent(v);return acc;}, {});
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
=> 형식의 함수를 활용하면 에러가 뜹니다.
comments.js 에서 똑같이 해봤는데, 동영상에서 보여주신 대로 delete 부분에서 => 형식의 콜백을 썼더니 에러가 납니다. 반면, github에 올리신 파일에는 function(){} 형식의 콜백이더군요. 실제로 function(){}으로 바꾸니 에러가 없이 잘 되기 시작했습니다.어쩨서 강좌 중에서는 =>의 화살표 함수를 써도 이상이 없는 건가요? ㅜ.ㅜ제가 이해한 바로는 이 경우에는 오히려 스스로의 this를 가지지 않는 => 형식의 함수를 써야 하는 거 같은데요... ㅜ.ㅜ 이하는 코드 전문입니다. 코드의 router.delete('/:id', function(req, res, next) 부분을 function()이 아닌 => 형식으로 바꾸면 에러가 터집니다. const express = require('express');const router = express.Router(); //괄호가 있으면 실행된 값을 배정. const {User, Comment} = require('../models');//GET /comment//get /comment/id 와는 같지 않ㅌ다. router.get('/:id', (req, res, next)=> { Comment.findAll({ include:{ model: User, where: {id: req.params.id}, } }) .then((comments)=>{ console.log(comments); res.json(comments) }) .catch((err)=>{ console.error(err); next(err); })}) router.patch('/:id', (req, res, next) =>{ Comment.update({ comment: req.body.comment, }, { where:{id: req.params.id } }) .then((result)=>{ console.log(result); res.json(result); }) .catch((err)=>{ console.error(err); next(err) })})router.delete('/:id', function(req, res, next) { Comment.destroy({ where: { id: req.params.id } }) .then((result) => { res.json(result); }) .catch((err) => { console.error(err); next(err); }); });router.post('/', function (req, res, next){ Comment.create({ commenter: req.body.id, comment: req.body.comment, }) .then((result)=>{ console.log(result); res.json(result); }) .catch((err)=>{ console.error(err); next(err) })}) // post에는 :id가 필요 억는 것에 주목. 생성한 후에, id가 생성 되는 거기 때문. module.exports = router;
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
app.js 내부의 명령어들은 어떤 신호를 언제 받아서 어떻게 콜 되나요?
안녕하세요. 좋은 강의 잘 듣고 있습니다. app.js가 총괄하는 우주선의 조종실 이라는 설명도 비유가 적절한 것 같습니다. 그러나, 갑자기 궁금한 점이 생겼는데, app.js의 내용들을 보면 대체로app.use 같은 미들웨어들을 끼워 맞춰 놓은 형식입니다. 근데 본문을 보면app.use('/', indexRouter); 이런식인데, 이말은 결국 프로그램 실행시 모든app.use()같은 친구들을 전부 한번 실행하란 말 아닌가요? 그리고 그 이후에는??evantListener, ajax 명령어 같은 게 있어야, 언제 어느 미들웨어들을 실행하는지를 정할 수 있을 텐데 app.js 안에는 없어 보여서요. 이하는 코드 전문입니다. var createError = require('http-errors');var express = require('express');var path = require('path');var cookieParser = require('cookie-parser');var logger = require('morgan');var indexRouter = require('./routes/index');var usersRouter = require('./routes/users');var commentsRouter = require('./routes/comments')var {sequelize} = require('./models')var app = express();sequelize.sync();// view engine setupapp.set('views', path.join(__dirname, 'views'));app.set('view engine', 'pug');app.use(logger('dev'));app.use(express.json());app.use(express.urlencoded({ extended: false }));app.use(cookieParser());app.use(express.static(path.join(__dirname, 'public')));app.use('/', indexRouter);app.use('/users', usersRouter);app.use('/comments', commentsRouter);// catch 404 and forward to error handlerapp.use(function(req, res, next) { next(createError(404));});// error handlerapp.use(function(err, req, res, next) { // set locals, only providing error in development res.locals.message = err.message; res.locals.error = req.app.get('env') === 'development' ? err : {}; // render the error page res.status(err.status || 500); res.render('error');});module.exports = app;
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
session[cookies.session] 가 두번 반복된 이유가 궁금합니다.
안녕하세요. 추석 잘 보내셨길 바랍니다. 본문의 코드 중에서cookies.session && session[cookies.session] && session[cookies.session].expires 부분을 보다가 궁금한 점이 있어서 질문 드립니다.무엇 때문에. session[cookies.session]를 두번 쓰고, 그 이후에 expires를 붙인 것인가요?실제로 session[cookies.session].expires를 한번만 쓰면 에러가 납니다. 코드를 리뷰 해봐도 알 수가 없네요. 어차피 같은 값이고, 똑같이 &&을 사용 했는데도 말이죠. 아래는 질문 한 부분의 코드 입니다. else if (cookies.session && session[cookies.session] && session[cookies.session].expires > new Date()) { res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' }); res.end(`${session[cookies.session].name}님 안녕하세요`);이하는 코드 전문입니다. ```const http = require('http');const fs = require('fs');const url = require('url');const qs = require('querystring');const session = {}; function parseCookies(req) {const list = {};const cookieString = req.headers.cookie;if (cookieString) {console.log(cookieString)cookieString.split(';').forEach((cookie) => { const parts = cookie.split('='); //list 짤막하게 나눠진 리스트. for each 마다. list[parts.shift().trim()]/* list가 옵젝이니, [] 형태로 key 값을 주는 거다. = 다음은 value */ = decodeURI(parts.join('='));}); //이말은 뭐냐. 처음의 것만 key 값으로 빼고, 그다음 것들은 a=1 식으로 붙여준다는 이야기다. foreach 마다. cookie의 데이터 형태에 익숙하지 않아서 벌어진 문제다.}return list;}http.createServer((req, res) => {const cookies = parseCookies(req);console.log(cookies)if (req.url.startsWith('/login')) {const { query } = url.parse(req.url);const { name } = qs.parse(query);const expires = new Date();const randomInt = +new Date();expires.setMinutes(expires.getMinutes() + 5);session[randomInt] ={name,expires}res.writeHead(302, { Location: '/', 'Set-Cookie': `session=${encodeURIComponent(randomInt)}; Expires=${expires.toGMTString()}; HttpOnly; Path=/`,});res.end();} else if (cookies.session && session[cookies.session] && session[cookies.session].expires > new Date()) {res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });res.end(${session[cookies.session].name}님 안녕하세요);} else {fs.readFile('./server4.html', (err, data) => {if (err) {throw err;}res.end(data);});}}).listen(8083, () => {console.log('8083번 포트에서 서버 대기중입니다!');});
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
schemas/index.js 소스 코드 중 궁금한 부분이 있습니다.
index.js 코드를 보면 const mongoose = require('mongoose');module.exports = () =>{ ... require('./user'); require('./comment');}require('./user') require('./comment') 이 부분을 보면 불러서 호출도 하지 않고 참조도 하지 않는데 이 코드가 의미가 있는 코드 인지 궁금합니다.질문을 정리하면 index.js 코드 안에 user와 comment를 require 해준 이유가 궁금합니다.