수강이 제한됩니다.
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
질문이요
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1. app.set('io',io) req.app.get('io') 이 두개를 통해서 이벤트를 발생시켜서 라우터와 소켓을 이용하잖아요. 그러면, 흐름이, 프론트 -> 라우터 -> 소켓 -> 다시 프론트(리액션) 이런식으로 통하는건가요? 소켓을 쓰기전에는 프론트 <-> 백엔드 (라우터를 통해서) 왔다갔다 한거 같은데, 소켓은 어느쯤에서 작동하는건가요?? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2. socket.js에서 app을 인자로 받잖아요, app을 받아서 app.set('io',io) 이런식으로 세팅을 하잖아요. 그러면 route/index.js 의 req.app.get('io') 도, app 을 받아서 쓰고 있다고 할 수 있는건가요? app.js 보면, app.use('/',indexrouter) 이런식으로 보내 주고 있는데, 즉 이 뜻이, req 안에 app 을 넣는 다는 이야기인가요 ? ??
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
질문이요
몽고 디비 세팅 하는거요, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1. room.js const mongoose = require('mongoose'); const {Schema} = mongoose; const roomSchema = new Schema({ ...}) chat.js const mongoose = require('mongoose'); const {Schema} = mongoose; const {Types : {ObjectId} } = Schema; const chatSchema = new Schema({ room: { type: ObjectId, required: true, ref: 'Room' }, ..}) chat.js 와 room.js 에서 다른 점이 , chat.js 에 const {Types : {ObjectId} } = Schema; 이것이 있는데, 이것은 무엇을 위해 사용하는건가요?? 무슨 뜻인가요?? 이 뜻이 몽구스에 서 Schema만 갖고와서 사용하겠다는 뜻인데, const {Schema} = mongoose; 이것은 Schema에서 Types : {ObjectId} 이것만 띄어 오면, ObjectID만 쓴다는건가요?? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2. 전체적으로 스키마 만들때요, 궁금한게 있는데요, const mongoose = require('mongoose'); const {Schema} = mongoose; const roomSchema = new Schema({ ...}) module.exports = mongoose.model('Room',roomSchema); 위와 같은 식으로 기본적으로 이루어 지잖아요. 도대체, const {Schema} = mongoose; 이 부분이 왜 필요한지를 모르겟네요.. 본문에서 Schema 자체가 안쓰이지 않나요? 그럴거면, 왜 mongoose 에서 Schema를 뽑아 내는 이유가 무엇인가요?? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3. module.exports = mongoose.model('Room',roomSchema); mogoose.model() 자체의 의미가 스키마를 구현하겠다 이소린가요? mongoose.model( 앞으로 불릴 스키마의 이름, 세팅된 스키마가 저장된 객체 ); 지금 제가쓴 인자들이 맞나요??
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
질문이여
질문 url.parse가 정확히 무슨 역할을하는지 모르겟네요. 밑에 보시는바와 같이, localhost:8003에서 localhost:8002로 요청보낼때, 인데요. console.log(req.get('origin')) 이런식으로 로그 찍어보면, 이런 값이 나오는데 http://localhost:8003 url.parse를 하면, 모든 값이 나오는데, 왜그런건가요 ?? ?? console.log(url.parse(req.get('origin'))) Url { protocol: 'http:', slashes: true, auth: null, host: 'localhost:8003', port: '8003', hostname: 'localhost', hash: null, search: null, query: null, pathname: '/', path: '/', href: 'http://localhost:8003/' }
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
질문이요.
현재 두개의 시크릿키 client 와 frontSecret 키들이 있잖아요. 1. clinentSecret 키는 서버간의 인증을 위한 키 frontSecret키는 프론트에서 서버로 보내줄때 인증을 위한키 보안상의 이유로 클라이언트 키가 프론트에서 보이는 것 보다 프론트 키가 프론트에서 보이는 걸 선호하는 이유가, 프론트키 와 유저가 직접입력한 도메인을 알아야 기에 좀 더 안전해서 프론트 키를 쓴다. 지금 제가 이해 한게 맞나요? 2. 현재 프론트에서 보내는 프론트 키 + 도메인으로 토큰을 발급 받을때요. localhost:8003/ 을 입렵하면, 라우터 / 이거 에서 frontSecret 키를 main.pug 로보내고, main.pug는 다시 locallhost:8002/v2/token 으로 보낸후, 이 라우터 안에서 DB에 제대로 유저가 등록한 도메인으로 요청을 했는지, where: { host: url.parse(req.get('origin')).host } 로 DB 체크후 CORS로 넘겨진후.. /token 라우터로 가서, 보내준 frontKey가 맞는지 체크하고 토큰을 발급을 해주잖아요. 그래서 /token 라우터 코드를 const { frontSecret } = req.body; 프론트키받고 where: { frontSecret } 이런식으로 DB에서 체크후 DB에 프론트키가 있는지 여부를 보고, 토큰을 발행해주나요. 그렇다면, 이전에 clientSeceret 키로 주고 받았잔아요. 예를 들면, nodebird-call 을 보시면, request 함수에, const URL = 'http://localhost:8002/v2'; const request = async (req, api) => { try { if (!req.session.jwt) { const tokenResult = await axios.post(`${URL}/token`, { clientSecret: process.env.CLIENT_SECRET, }); .......} 이런식으로 axios를 통해서 http://localhost:8002/v2/token 에다가, clientSecret을 보내고, 위와 같은 흐름으로 client 키를 통해서 v2.js 에서 도메인도 체크하고난후, /token 라우터를 통해서, const { frontSecret } = req.body; 프론트키받고 where: { frontSecret } 이런식으로 DB에서 체크후 체크를 하는데 , 문제는 frontSecret을 받으려고하잖아요. 이럴경우는 clientSecret을 따로 받을 수 있게, v2-1.js 이런식으로 새로 만들고, 아예 http://localhost:8002/v2-1/token 이런식으로 요청을 받을수 있게 하는게 나은가요 ?? 3. 그리고, 만약에 clientSecret만 으로 토큰을 받는다면, 도메인 체크는 할 필요가 없어지는게 맞죠? 애초에 프론트에 나오지 않아 해킹에 위험이 적어지니까요.
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
질문이요
JWT 발급 받을때요, nodebird-call ---> nodebird-api 로 요청 하여, nodebird-api가 JWT 발급 해주잖아요. Axios 는 이 두 개의 서버간의 응답을 주고 받게해주는 라이브 러리 이구요. const URL = 'http://localhost:8002/v1'; const tokenResult = await axios.post(`${URL}/token`, { clientSecret: process.env.CLIENT_SECRET, }); 지금 이부분에서 v1/token 으로 요청을 보냈잖아요. 그러면 nodebird-api 에서 라우터가 응답을 받고, 보내진 clientSecret이 디비에 있는지 확인하고 있으면 JWT를 발행 해주자나요. router.post('/token', async (req, res) => { const { clientSecret } = req.body; try { const domain = await Domain.find({ where: { clientSecret }, include: { model: User, attribute: ['nick', 'id'], }, }); 여기서 궁금한거는요, clientSecret: process.env.CLIENT_SECRET, axios를 통해서 보냈는데, 왜 V1.js 는 const { clientSecret } = req.body; 왜 req.body를 통해서 받나요, 애초에 axios를 통해서 보내줄 필요가 없는거 아닌가요 ? ? ? ?
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
질문이요
프로젝트가 크지않으면 시퀄라이즈로 쓰신다고 하셨는데, 프로젝트가 커지면 시퀄라이즈 보다는 sql을 쓰시나요?? sql 을 노드에 바로 연결을 할 수있는건가요/?? 이유가 따로 있나요??
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
질문이요
const query = req.query.hashtag; 이 부분이요. 모든 검색 엔진은 express에서 req.query로 들어오나요? main.pug 보면 input(type='text' name='hashtag' placeholder='태그 검색') req.query.hashtag 에서 hashtag에 들어온 이유는 name 이 hashtag라 그런거는 알겠는데, ㄱquery로 들어온 이유가 검색엔진이기 때문에 query로 들어온게 맞난요 ?
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
이해 안가네요...
도대체, await post.addHashtags(result.map(r=>r[0])) 이 어떻게 작동하는지 이해가 안가네요.. 질문1. posts 와 hashtags 는 다대다 관계로 postHashtag 라는 조인 테이블이 생성된 상태입니다. 이 라우터의 post.js 에서는 현재 post는 const post = await Post.create({ content:req.body.content, img:req.body.url, userId: req.user.id, //작성자 사용자 아이디. }); 이거를 담고 있으니까, post 테이블의 DB를 갖고있다는 뜻이고, A.addB 이 뜻이, A 와 B는 테이블을 말하는거죠? 그러면 post.addHashtags 라는게 post.addhastags가 되야하는거 아닌가요?? 왜 대문자Hashtags가 되야하나요?? 질문2. 그리고, result.map(r=>r[0]) 이 부분 잘이해 안가네요 설명좀 해주세요.. 질문3. 그리고, 저는 애초에 디비 테이블짤때 이름을 hashtag 이런식으로 만들었는데 module.exports=(seqelize,DataTypes)=>( seqelize.define('hashtag',{ title:{ type: DataTypes.STRING(15), allowNull:false, unique:true, } },{ timestamps:true, paranoid:true }) ); 왜 workbench 로 보면, hashtags 로 만들어지는거죠? 지가 알아서 s를 붙이네요...?
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
질문이요.
const post = await Post.create({ content:req.body.content, img:req.body.url, userId: req.user.id, //작성자 사용자 아이디. }); req.body.conent와 req.body.url 인유가 main.pug가 div form#twit-form(action='/post' method='post' enctype='multipart/form-data') .input-group textarea#twit(name='content' maxlength=140) .img-preview img#img-preview(src='' style='display: none;' width='250' alt='미리보기') input#img-url(type='hidden' name='url') 이런식으로 이름을 content 와 url로 지정되어서, 바디파서가 이런식으로 읽어 들어오는걸 알겠는데요. req.user.id는 어떤 흐름으로 오는지 잘 이해가 안가네요.. 설명좀 부탁 드려요
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
사진업로드 짹짹 버튼
사진업로드 하고 짹짹 버튼 있잖아요. router.post('/img',isLoggedIn,upload.single('img'),(req,res)=>{ ..} 이 라우터는 사진 업로드 버튼 누를시 실행 되잖아요. 굳이 짹짹 버튼 누르지 않아도, 서버 지정 폴더에 저장되는거 같은데 맞나요?? 저장되어서 url 정보들고 오는거 같은데 맞나요? router.post('/',isLoggedIn,upload2.none(),async(req,res,next)=>{..} 이 라우터는 짹짹 버튼 누르면 실행되는데, 이것은 저장된 이미지 url,텍스트들을 데이터베이스에 넣는 용도같은데 맞나요??
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
app.use 매개변수에 관하여
app.use의 매개변수로 함수를 사용할 때, app.use((req, res, next)=>{}); 와 같은 형태로 사용을 했는데, 이번 강의에서 error 처리를 하는 경우에 app.use((err, req, res)=>{ }); 이렇게 작성을 하더라구요. 그런데 위쪽의 함수와 아래쪽의 함수가 사실 형태는 똑같고 매개변수의 이름만 다른건데 어떻게 다른 동작을 하는건지 이해가 안돼요. 지금 err가 req의 자리에 있기 때문에 req로써 동작을 해야하는게 맞지 않나요? 마찬가지로 req는 res로, res는 next로 동작을 해야 할 것 같은데, 제가 잘못 이해하고있나요?
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
restFront.js와 restServer.js
공부하다가 궁금한 점이 생겨서 질문합니다. restFront.js 부분을 보면 users라는 변수를 import와 같은 과정이 없이 바로 쓰더라구요. 그게 아래처럼 restServer.js에서 readfile로 restFront.js를 로드해서 사용하기 때문에 restServer의 user를 그냥 쓸 수 있게 되는건가요?
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
질문이요
local passport 때는 req.login 이 부분에서 serialize 로 가던데, 카카오로그인시에는 serialize를 언제 해주나요?
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
AJAX
데이터가 front end <-> back end 사이에서 왔다갔다 하는 부분이 잘 이해가 안되는데 AJAX 할 줄 알아야 이해되나요? 어떤 코드에서 front 데이터가 back단으로 넘어오는지 잘 모르겠네요
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
질문이요.
//////////////////////////////////////////////////////// 강의를 여러번 다시보고 질문좀 남겨요... npm start를 하면, app.js 에서 연결된 모든 const 000 = requires('./000') or requires('0000') 들이 시작되고나서, 모든 미들웨어 들이 위에서부터 시작하잖아요. 여기에서 의문점은요, 이 경우에 app.use(passport.initialize()); app.use(passport.session()); app.get('/', indexRouter) app.use(passport.session()); 가 passport.deserializeUser를 실행 시킨다고 하셧잖아요. 그래서 이런 식으로 console.log를 넣어 봤습니다. passport.deserializeUser((id, done) => { console.log("안녕 나 실행.") ........... } 인제 npm start를 하고 메인 페이지를 돌려 봤습니다. 순서상으로, app.get('/', indexRouter) 가 app.use(passport.session()); 보다 뒤 인데, 콘솔 로그에는 "안녕 나 실행." 이 찍히지 않았습니다. 이 뜻은, serializeUser가 된 상태에서만, deserializeUSer 가 작동 된다는 사실인가요? 미들웨어인 app.use(passport.initialize()); app.use(passport.session()); 가 있어도, 그냥 작동만하고 next()처럼 넘어가는 형식인가요? 로그인을 하지 않는 이상 찍히지 않네요. 로그인을 해서 serializeUser 상태에서만 deserializeUSer이 가능한뜻인가요..? 그러면 로그인을 누름과 동시에 serializeUser에 저장이되고, app.use(passport.session());에서 걸려서, passport.session()은 passport.deserializeUser를 불러서, passport.deserializeUser는 id와 done을 콜백함수로 넘겨주는 건가요?? //////////////////////////////////////////////////////// 로그인시, join.pug 에서 extends layout block content .timeline form#join-form(action='/auth/join' method='post') .input-group label(for='join-email') 이메일 input#join-email(type='email' name='email') .input-group label(for='join-nick') 닉네임 input#join-nick(type='text' name='nick') .input-group label(for='join-password') 비밀번호 input#join-password(type='password' name='password') if joinError .error-message= joinError button#join-btn.btn(type='submit') 회원가입 에서 name 그대로 email 과 password를 넘어 오잖아요. 로그인 버튼을 클릭시, app.js 에서, .... app.use(express.urlencoded({extended : false })); app.use('/auth', authRouter); ... app.use(express.urlencoded({estended : false})); 프론트에서 받은 email 과 password를 읽어오고난후, app.use('/auth', authRouter); 에 걸려서, auth.js로가서 router.post('/login',isNotLoggedIn,(req,res,next)=>{ //req.body.email req.body.password passport.authenticate('local',(authError,user,info)=>{ ..... return res.redirect('/'); }); })(req,res,next); }); router.post('/login',isNotLoggedIn,(req,res,next)=> 여기에서의 req.body.email 과 req.body.password로 접근 가능, app.use(express.urlencoded({estended : false})); 에서 읽어 왔기 때문에. passport.authenticate('local' 이것이 실행되면, localStrategy.js 를 불러서, passport.use(new LocalStrategy({ usernameField: 'email', // req.body.email join.pug 에서 넘어옴. passwordField: 'password', //req.body.password }, async(email, password, done) =>{ ... done(null, exUser); } usernameField: 'email' passwordField: 'password' 궁금한게, 'email' 와'password' 만 으로 접근이 가능한 이유에요. 지금 이게 join.pug의 것인데, email 와 password name 그대로 써준것 뿐인데 바로 넘어와서 쓸 수 있는게 잘 이해가 안가네요/? 왜 req.body.email 과 req.body.password 이런식으로 접근을 안하나요??? 그리고 email, password, done 의 async 인자들은 갑자기 어디서 나온건지가 잘이해가 안가네요 ?? new LocalStrategy (...) 에서 email, password, done 의 async 콜백 인자를 넘겨 준건가요??? 그리고 async쓰신 이유좀 알려주실수있나요?? 모든게 잘 작동하면(비밀번호가 비크립으로 잘 맞고이러면), done(null, exUser); 를 하고나서, 다시 passport.authenticate('local',(authError,user,info)=>{ .... return req.logIn(user,(loginError)=>{ .... return res.redirect('/'); }); })(req,res,next); }); 여기에서 done() 에서 콜백으로 인자를 넘겨주잖아요. (authError,user,info)=>{ done() 은 어떤식으로 짜여있나요..? 실패 성공 여부와 실패시 메세지 넘기는 용도로만 사용하나요? req.logIn(user, 인제 여기서 드디어, serializeUser를 해주잖아요. passport.serializeUser((user, done) => { // {id:1, name:zero, age:25} -> 1 done(null, user.id); // 사용자 정보를 모두 세션에 저장하기 무거워서 아이디만 저장. }); done(null, user.id); 여기서 세션에 저장을 시키는 건가요? done(null,user.id) 면 user.id를 인자로 넘기는거 아닌가요?????? done(null,user.id) 넘어 와서(성공시), return res.redirect('/'); 이렇게 리다이렉이 되고, app.js가 다시 실행되고 나서, app.use(passport.initialize()); app.use(passport.session()); 여기에서, app.use(passport.session()); 이 deserializeUser 를 실행시키고, passport.deserializeUser((id, done) => { console.log("안녕 나 실행.") // 1 로 찾고-> {id:1, name:zero, age:25} 찾은후 -> req.user 저장 if(user[id]){ done(user[id]); }else{ User.findOne({ where: { id } }) .then(user => done(null, user)) .catch(err => done(err)); } }); serializeUser로 저장된 user.id 가 passport.session()에 의해서 인자가 전달되는건가요 ? then(user => done(null, user)) 이 뜻 잘이해가 안가네요?? 이게 done(null,user)로 넘긴다는건가요 ? 넘긴다면 어디로 콜백을 넘기나요?? app.js에서 app.get('/', indexRouter) 이렇게 되잖아요. page.js 에 이것에 걸리고 router.get('/', (req, res, next) => { res.render('main', { // main.pug 렌더링 title: 'NodeBird', // main.pug에 있는 변수들 twits: [], user: req.user, // 즉 done에서 성공시 in localStoragy 세션에 저장이됨 그러고 나서 로그인후 req.user로 접근가능. loginError: req.flash('loginError'), //일회성 메세지들 보여주기위해 에러 넣음 }); }); 즉 이뜻이 then(user => done(null, user)) req.user에 넣어준다는 이야기인가요?
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
file remove 질문입니다.
3:40 부근에 파일명이 newfile.js인데 fs.unlink('./folder/newFile.js')로 적혀있어도 지워지나요? window 기반이라서 대소문자 구별없이 지워지는건가요?
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
카카오로그인 질문입니다.
카카오 로그인을 하면 이런 에러가 발생합니다. 테이블에 한글이 입력되어 이런 에러가 발생하는 것 같은데 시퀄라이즈에서는 이를 어떻게 해결하는지 궁금합니다.
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
deserializeUser에대해서...
로그인 성공시, app.use(passport.initialize()); app.use(passport.session()); 이거를 통해서, passport/index.js 에서의 passport.deserializeUser((id, done) => { User.find({ where: { id } }) .then(user => done(null, user)) .catch(err => done(err)); }); 이게 작동하잖아요. serializeUser를 통해서 id를 세션에 저장을 해두었다고 하셨는데, passport.deserializeUser((id, done) 여기서, id 와 done 의 인자를 갖고있는 콜백함수인데,id와 done은 누가 입력을 해주는건가요...? id 와 done이 잘 입력되서, .then(user => done(null, user)) done(null,user) 가 콜백으로 리턴되는거같은데, 이거는 도대체 어디에 리턴이 되는건가요...? 지금 user => done(null, user) 에게 콜백함수 맞죠? (변수) => 리턴 이 함수 형태맞죠? 디시리얼라이즈 이후로, req.user에 저장이되는건가요? 시리얼라이즈 이후로 req.user에 저장이 되는게 아니였나요/? 헷갈리네요.... router.get('/', (req, res, next) => { res.render('main', { // main.pug 렌더링 title: 'NodeBird', // main.pug에 있는 변수들 twits: [], user: req.user, // 즉 done에서 성공시 in localStoragy 세션에 저장이됨 그러고 나서 로그인후 req.user로 접근가능. loginError: req.flash('loginError'), //일회성 메세지들 보여주기위해 에러 넣음 }); });
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
흐름에 대해서 궁금합니다.
npm start를 하면, app.js 에서 app.get('/', indexRouter) 에 걸리잖아요 . 이것 전에, app.use(passport.initialize()); app.use(passport.session()); 1. 이 두개가 있는데, 로그인을 하지않아서 passport 값이 없기 때문에 그냥 지나치나요? _________________________________________ 인제 아이디, 비밀번호를 치고 로그인을 하면, app.js에서 app.use('/auth', authRouter); 여기에 걸려서, router/auth.js 에서 router.post('/login', isNotLoggedIn, (req, res, next) => { passport.authenticate('local', (authError, user, info) => { 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); } return res.redirect('/'); }); })(req, res, next); // 미들웨어 내의 미들웨어에는 (req, res, next)를 붙입니다. }); 2. passport.authenticate('local', 가 locastoragy를 부르신다고 했잖아요. 어떻게 local만 썻는데 연결이 되는지 궁금하네요? ___________________________________________ 이 부분이 실행되면, return req.login(user, module.exports = (passport) => { passport.serializeUser((user, done) => { done(null, user.id); }); serializuSer 가 실행되잖아요 3. done(null, user.id)가 req.login(user...)의 user를 나타낸건가요? 즉 req.loging(user...) 의 user는 user.id인가요? ___________________________________________ 4. return res.redirect('/'); 이거를 해준 이유는, 다시 재 요청을 받아, app.use(passport.initialize()); app.use(passport.session()); 이거를 통해서 deserializeUser를 하기위함인가요?
- Node.js 교과서 - 기본부터 프로젝트 실습까지
질문이요
삭제된 글입니다