Node.js 교과서 - 기본부터 프로젝트 실습까지

Node.js 교과서 - 기본부터 프로젝트 실습까지

55,000원
지식공유자 · 조현영
145회 수업· 총 24시간 24분수업
평생 무제한 시청
수료증 발급 강의
수강 난이도 중급이상
김현진 프로필

mysql 설정관련 문의입니다. 김현진 12일 전
sequelize db:create  입력 시 Access denied for user 'root'@'localhost' (using password: YES)라는 에러가 계속 뜨는데 해경방법이 궁금합니다.

3
김학준 프로필

질문입니다~!. 김학준 23일 전
  // store: new RedisStore({   //   host: process.env.REDIS_HOST,   //   port: process.env.REDIS_PORT,   //   pass: process.env.REDIS_PASSWORD,   //   logErrors: true,   // }), 위부분을 포함시켜 실행시키면 서버가 응답하지 않습니다 어떤부분을 실수했을까요 ?

2
exsylee 프로필

await 관련 질문드립니다. exsylee 27일 전
안녕하세요. 강의 잘 듣고있습니다.  다름이 아니라 강의에 나온 내용대로 실습을 진행하고 있는데, await 구문에서 에러가 발생하여 문의합니다.  const express = require('express');const bcrypt = require('bcrypt');const passport = require('passport');const { User } = require('../models');const router = express.Router();// POST /auth/joinrouter.post('/join', (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'); } const hash = await bcrypt.hash(password, 12); await User.create({ email, nick, password: hash }); return res.redirect('/'); } catch (error) { console.log(error); next(error); }}); package.json 버전입니다. "dependencies": { "bcrypt": "^5.0.0", "connect-flash": "^0.1.1", "cookie-parser": "^1.4.5", "dotenv": "^8.2.0", "express": "^4.17.1", "express-session": "^1.17.1", "morgan": "^1.10.0", "mysql2": "^2.1.0", "passport": "^0.4.1", "passport-kakao": "^1.0.0", "passport-local": "^1.0.0", "pug": "^3.0.0", "sequelize": "^5.21.13"}, 실행하면  아래와 같이 await 구문에 async함수가 아니라고 나오는데요..  bcryt.hash 함수도 마찬가지 입니다.  어떻게 처리해야 할까요?  [nodemon] starting `node app.js` C:\nodejs-workspace\nodejs-book\nodebird\routes\auth.js:14         const exUser = await User.find( { where: { email } });                        ^^^^^ SyntaxError: await is only valid in async function ?[90m    at wrapSafe (internal/modules/cjs/loader.js:1054:16)?[39m ?[90m    at Module._compile (internal/modules/cjs/loader.js:1102:27)?[39m ?[90m    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1158:10)?[39m ?[90m    at Module.load (internal/modules/cjs/loader.js:986:32)?[39m ?[90m    at Function.Module._load (internal/modules/cjs/loader.js:879:14)?[39m ?[90m    at Module.require (internal/modules/cjs/loader.js:1026:19)?[39m ?[90m    at require (internal/modules/cjs/helpers.js:72:18)?[39m     at Object.<anonymous> (C:\nodejs-workspace\nodejs-book\nodebird\app.js:12:20) ?[90m    at Module._compile (internal/modules/cjs/loader.js:1138:30)?[39m ?[90m    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1158:10)?[39m

1
ritmakid@hotmail.com 프로필

GCP관련질문입니다. ritmakid@hotmail.com 28일 전
제로초님이 하신대로 gcp 컴퓨트엔진으로 생성해서초기설정(apt-get update, npm 설치등등)하고 express-generator로 express 제일 기본앱을 만들었는데외부아이피로 3000포트 붙여서 접속해도 계속 로딩만 돌고 접속이 안되어서 질문드립니다. 혹시 방화벽 문제인가 싶어서 방화벽도 수신,송신을 3000을 다 열어놨는데도 안되고그래서 bin/www열어서 3000포트를 80번 포트로 바꿨더니`Port 80 requires elevated privileges`라는 에러가 뜨네요어떻게 해결하면 좋을지 조언을 구합니다.강의 감사히 보고있습니다~!!

9
김학준 프로필

이미지 업로드 부분 질문입니다 김학준 1달 전
이미지를 불러오는 부분에서 404 에러가 뜹니다.. 코드는 제로초님 git 헙에서 받아서 사용했습니다.  어느 부분을 확인해봐야할까요 >? 

5
Deneb 프로필

orm 사용 관련 질문입니다 Deneb 1달 전
대규모 서비스에서 sequelize와 같은 orm 사용시 query문을 사용하는 것과 비교해서 성능 저하가 있는지 궁금합니다.

1
leewj4242 프로필

오류가 나서 질문을 드립니다. leewj4242 1달 전
auth.js 입니다. const express = require('express'); const passport = require('passport'); const bcrypt = require('bcrypt'); const { isLoggedIn, isNotLoggedIn } = require('./middlewares'); const { User } = require('../models'); const router = express.Router(); 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');     }     const hash = await bcrypt.hash(password, 12);     await User.create({       email,       nick,       password: hash,     });     return res.redirect('/');   } catch (error) {     console.error(error);     return next(error);   } }); 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);  }); router.get('/logout', isLoggedIn, (req, res) => {   req.logout();   req.session.destroy();   res.redirect('/'); }); module.exports = router; app.js 입니다. const express = require('express'); const path = require('path'); const cookieParser = require('cookie-parser'); const morgan = require('morgan'); const session = require('express-session'); const flash = require('connect-flash'); const passport = require('passport'); require('dotenv').config(); const indexRouter = require('./routes/page'); const authRouter = require('./routes/auth'); const { sequelize } = require('./models'); const passportConfig = require('./passport'); const app = express(); sequelize.sync(); passportConfig(passport); app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'pug'); app.set('port', process.env.PORT || 8002); app.use(morgan('dev')); app.use(express.static(path.join(__dirname, 'public'))); app.use(express.json()); app.use(express.urlencoded({ extended: false })); app.use(cookieParser(process.env.COOKIE_SECRET)); app.use(session({   resave: false,   saveUninitialized: false,   secret: process.env.COOKIE_SECRET,   cookie: {     httpOnly: true,     secure: false,   }, })); app.use(flash()); app.use(passport.initialize()); app.use(passport.session()); app.use('/', indexRouter); app.use('/auth', authRouter); app.use((req, res, next) => {   const err = new Error('Not Found');   err.status = 404;   next(err); }); app.use((err, req, res, next) => {   res.locals.message = err.message;   res.locals.error = req.app.get('env') === 'development' ? err : {};   res.status(err.status || 500);   res.render('error'); }); app.listen(app.get('port'), () => {   console.log(app.get('port'), '번 포트에서 대기중'); });

4
김도영 프로필

참여자 1명일때 새로고침 문제 김도영 1달 전
참여자 수 표시 부분을 보다가 채팅방의 총 참여자 수가 1명일때 새로고침을 하면 최초 새로고침 시에는 참여자 수가 0 -> 1로 변환이 됩니다. 이상없습니다. 그런데 2번째 새로 고침을 하면 채팅방이 삭제되버립니다. socket.js 의 socket.on('disconnect' .... 부분이 실행되는것 같은데.. 새로고침을 하면 pug 파일의 소스에 의해 connect 가 발생하고, 그에 따라 socket.js 의 connection 이벤트에 수신되는건 알겠는데..  socket.on('disconenct' ... 이 부분은 어떻게 실행이 되는건가요? disconnect 이벤트가 호출되는 부분이 어디인지... 그리고 왜 최초 새로고침은 참여자수를 0 => 1 로 수정하는데 2번째 새로고침 에는 disconnect 가 수행되어,  if( userConut === 0 ) 에 의해 방이 삭제되어 버리는지 모르겠습니다. 조언 부탁드립니다.

3
둥치탁치 프로필

질문있습니다. 둥치탁치 1달 전
깃허브에서 수정 시 구글클라우드에서도 수정 되게 하려면 어떻게 해야 하나요??

1
안현지 프로필

4장 웹서버 만들기 질문 안현지 1달 전
안녕하세요 : ) 4장 웹서버 만들기에서 const http=require('http'); const fs=require('fs'); const server=http.createServer((req,res)=>{ //req는 사용자로부터 온 요청이고 res통해 응답     console.log('서버실행');// <---------------1번만 실행하도록 했는데     fs.readFile('./server2.html',(err,data)=>{         if(err){             throw err;         }         res.end(data);     }); }).listen(8080); server.on('listening',()=>{     console.log('8080포트에서 서버 대기중'); }); server.on('error',(error)=>{//에러 처리     console.error(error); }); 8080포트에서 서버 대기중 서버실행 서버실행 <----- 실제 브라우저에 localhost:8080을 치면 서버실행이 왜 2번 찍히는지 궁금합니다..!

1
김현진 프로필

npm start로 서버 시작시 에러발생 김현진 1달 전
Error: No default engine was specified and no extension was provided. 이 에러가 뜨는데 왜그런것일까요??

1
SILENMUS 프로필

[ async/await ] - 다음 then절로 넘어가지 않게 하기. SILENMUS 1달 전
안녕하세요 강사님 패스포트 로그인 구현중 입니다. async,await에서 특정 조건일때 process를 멈추게 하고 싶습니다. --------------------------------------------------------------- await User.findOne({ where: { id:global.user_id } }) .then((user)=>{ return bcrypt.compare(password, user.password); // 찾은 아이디의 비번과 front에서 받은 비번 비교 }) .then((result)=>{ if(result === false){ // 비밀번호가 일치하지 않는다면, res.status(403).send("비밀번호가 틀립니다."); ⛔ 여기서 멈추게 하고 싶습니다 ⛔ }else{ // 비밀번호가일치한다면 return true; } }) .then((result)=>{ 어떤 다른 로직 }) .catch((error) => { console.error(error); next(error); }); --------------------------------------------------------------------- 저는 res.send를 하면 동기 process가 종료될줄알았는데 그거와는 별개로  밑의 모든 then절의 코드가 실행되었습니다.  특정조건일 때 동기작업을 멈출 수 있는 방법이 있을까요??

3
leewj4242 프로필

오류가 나서 질문 드립니다. leewj4242 1달 전
app.js var createError = require('http-errors'); var express = require('express'); var path = require('path'); var logger = require('morgan'); var indexRouter = require('./routes'); var usersRouter = require('./routes/users'); var { sequelize } = require('./models'); var app = express(); sequelize.sync(); // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade'); app.use(logger('dev')); app.use(express.json()); app.use(express.urlencoded({ extended: false })); app.use(express.static(path.join(__dirname, 'public'))); app.use('/', indexRouter); app.use('/users', usersRouter); // catch 404 and forward to error handler app.use(function(req, res, next) { next(createError(404)); }); // error handler app.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; user.js module.exports = (sequelize, DataTypes) => { return sequelize.define('user', { name : { type : DataTypes.STRING(20), allowNull : false, unique : true, }, age : { type : DataTypes.INTEGER.UNSIGNED, allowNull : false, defaultValue : 0, }, married : { type : DataTypes.BOOLEAN, allowNull : false, }, comment : { type : DataTypes.TEXT, allowNull : true, }, created_at : { type : DataTypes.DATE, allowNull : false, defaultValue : sequelize.literal('now()'), } }, { timestamps : false, underscored : true, }); } index.js const path = require('path'); const Sequelize = require('sequelize'); const env = process.env.NODE_ENV || 'development'; const config = require('../config/config.json')[env]; const sequelize = new Sequelize(config.database, config.username, config.password, config); const db = {}; db.Sequelize = Sequelize; db.sequelize = sequelize; db.User = require('./user')(sequelize, Sequelize); db.Comment = require('./comment')(sequelize, Sequelize); db.User.hasMany(db.Comment, { foreignKey : 'commenter', sourceKey : 'id' }); db.Comment.belongsTo(db.user, { foreignKey : 'commenter', targetKey : 'id' }); module.exports = db; comment.js module.exports = (sequelize, DataTypes) => { return sequelize.define('comment', { comment : { type : DataTypes.STRING(100), allowNull : false, }, created_at : { type : DataTypes.DATE, allowNull : false, defaultValue : sequelize.literal('now()') }, }, { timestamps : false, underscored : true, }); } 이건 에러코드 입니다. > learn-sequelize@0.0.0 start C:\Users\DELL\Desktop\JS연습\learn-sequelize > node ./bin/www C:\Users\DELL\Desktop\JS연습\learn-sequelize\node_modules\sequelize\lib\associations\mixin.js:93       throw new Error(`${source.name}.${_.lowerFirst(Type.name)} called with something that's not a subclass of Sequelize.Model`);       ^ Error: comment.belongsTo called with something that's not a subclass of Sequelize.Model     at Function.<anonymous> (C:\Users\DELL\Desktop\JS연습\learn-sequelize\node_modules\sequelize\lib\associations\mixin.js:93:13)     at Object.<anonymous> (C:\Users\DELL\Desktop\JS연습\learn-sequelize\models\index.js:18:12)     at Module._compile (internal/modules/cjs/loader.js:955:30)     at Object.Module._extensions..js (internal/modules/cjs/loader.js:991:10)     at Module.load (internal/modules/cjs/loader.js:811:32)     at Function.Module._load (internal/modules/cjs/loader.js:723:14)     at Module.require (internal/modules/cjs/loader.js:848:19)     at require (internal/modules/cjs/helpers.js:74:18)     at Object.<anonymous> (C:\Users\DELL\Desktop\JS연습\learn-sequelize\app.js:8:21)     at Module._compile (internal/modules/cjs/loader.js:955:30)     at Object.Module._extensions..js (internal/modules/cjs/loader.js:991:10)     at Module.load (internal/modules/cjs/loader.js:811:32)     at Function.Module._load (internal/modules/cjs/loader.js:723:14)     at Module.require (internal/modules/cjs/loader.js:848:19)     at require (internal/modules/cjs/helpers.js:74:18)     at Object.<anonymous> (C:\Users\DELL\Desktop\JS연습\learn-sequelize\bin\www:7:11)     at Module._compile (internal/modules/cjs/loader.js:955:30)     at Object.Module._extensions..js (internal/modules/cjs/loader.js:991:10)     at Module.load (internal/modules/cjs/loader.js:811:32)     at Function.Module._load (internal/modules/cjs/loader.js:723:14)     at Function.Module.runMain (internal/modules/cjs/loader.js:1043:10)     at internal/main/run_main_module.js:17:11 npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! learn-sequelize@0.0.0 start: `node ./bin/www` npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the learn-sequelize@0.0.0 start script. npm ERR! This is probably not a problem with npm. There is likely additional logging output above. npm ERR! A complete log of this run can be found in: npm ERR!     C:\Users\DELL\AppData\Roaming\npm-cache\_logs\2020-05-29T11_34_06_481Z-debug.log

2
SILENMUS 프로필

nodejs naming 관련 질문입니다. SILENMUS 1달 전
안녕하세요 프로젝트를 만들던 중 강의볼때는 무심코 지나쳤던 naming에 관해  궁금증이 생겨 질문드립니다.  대략적으로 3가지가 궁금합니다.               ✔ NodeJs URL :  한 단어인 경우에는 상관없지만 (ex, /board/)  단어 조합인 경우에는 어떤 case로 적어야 좋을까요?? 마이 페이지 라는 페이지를 라우팅할때  myPage | my-page | my_page | my_Page ...              ✔ css/js/pug File :  위와 같이 한단어인 경우에는 소문자로 page.js/page.css/page.pug 로 하면 되는데 ,  두 단어 조합인 경우에는 어떻게 처리해야 될까요??  myPage | my-page | my_page | my_Page ...              ✔ pug input name :  회원가입시 form안에 이름,아이디,비밀번호 등을 서버로 보낼때 name을 사용합니다. 이 name에 어떤 case로 네이밍을 해야 할까요?? user_name | user-name | userName ....

1
김현진 프로필

서버 클라이언트 김현진 1달 전
강의와는 좀 벗어나는 질문이지만 궁금한점이 있습니다.app.js라는 파일안에는 백엔드/프론트앤드 코드가 다 있는건가요?예를들어 유저가 크롬상단검색창에 zerocho.com을 입력했을때 서버로 get메소드 요청이 오고 응답으로 html파일을 넘겨줘야 홈페이지에 접속을 할 수 있듯이 말입니다.app.js파일안에 서버의 데이터를 요청하는 코드도 구성되어지는지 궁금합니다(fetch API를 이용해서 서버데이터를 가지고 오는 코드도 app.js 파일에 짜는게 맞는지 궁금합니다.)어떤틀을 가지고 웹페이지 코드가 구성이 이루어지는지 궁금합니다. 머리속에는 궁금점을 글로 쓸려니 어렵네요 .감사합니다.

1
지식공유자 되기
많은 사람들에게 배움의 기회를 주고,
경제적 보상을 받아보세요.
지식공유참여
기업 교육을 위한 인프런
“인프런 비즈니스” 를 통해 모든 팀원이 인프런의 강의들을
자유롭게 학습하는 환경을 제공하세요.
인프런 비즈니스