수강이 제한됩니다.
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- Node.js 교과서 - 기본부터 프로젝트 실습까지
10장 웹 API 서버 만들기 에러 질문입니다.
삭제된 글입니다
- 해결됨Node.js 교과서 - 기본부터 프로젝트 실습까지
await 관련 질문드립니다.
안녕하세요. 강의 잘 듣고있습니다. 다름이 아니라 강의에 나온 내용대로 실습을 진행하고 있는데, 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
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
GCP관련질문입니다.
제로초님이 하신대로 gcp 컴퓨트엔진으로 생성해서초기설정(apt-get update, npm 설치등등)하고 express-generator로 express 제일 기본앱을 만들었는데외부아이피로 3000포트 붙여서 접속해도 계속 로딩만 돌고 접속이 안되어서 질문드립니다. 혹시 방화벽 문제인가 싶어서 방화벽도 수신,송신을 3000을 다 열어놨는데도 안되고그래서 bin/www열어서 3000포트를 80번 포트로 바꿨더니`Port 80 requires elevated privileges`라는 에러가 뜨네요어떻게 해결하면 좋을지 조언을 구합니다.강의 감사히 보고있습니다~!!
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
이미지 업로드 부분 질문입니다
이미지를 불러오는 부분에서 404 에러가 뜹니다.. 코드는 제로초님 git 헙에서 받아서 사용했습니다. 어느 부분을 확인해봐야할까요 >?
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
orm 사용 관련 질문입니다
대규모 서비스에서 sequelize와 같은 orm 사용시 query문을 사용하는 것과 비교해서 성능 저하가 있는지 궁금합니다.
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
오류가 나서 질문을 드립니다.
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'), '번 포트에서 대기중'); });
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
참여자 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 ) 에 의해 방이 삭제되어 버리는지 모르겠습니다. 조언 부탁드립니다.
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
질문있습니다.
깃허브에서 수정 시 구글클라우드에서도 수정 되게 하려면 어떻게 해야 하나요??
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
4장 웹서버 만들기 질문
안녕하세요 : ) 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번 찍히는지 궁금합니다..!
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
npm start로 서버 시작시 에러발생
Error: No default engine was specified and no extension was provided. 이 에러가 뜨는데 왜그런것일까요??
- 해결됨Node.js 교과서 - 기본부터 프로젝트 실습까지
[ async/await ] - 다음 then절로 넘어가지 않게 하기.
안녕하세요 강사님 패스포트 로그인 구현중 입니다. 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절의 코드가 실행되었습니다. 특정조건일 때 동기작업을 멈출 수 있는 방법이 있을까요??
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
오류가 나서 질문 드립니다.
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
- 해결됨Node.js 교과서 - 기본부터 프로젝트 실습까지
nodejs naming 관련 질문입니다.
안녕하세요 프로젝트를 만들던 중 강의볼때는 무심코 지나쳤던 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 ....
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
서버 클라이언트
강의와는 좀 벗어나는 질문이지만 궁금한점이 있습니다.app.js라는 파일안에는 백엔드/프론트앤드 코드가 다 있는건가요?예를들어 유저가 크롬상단검색창에 zerocho.com을 입력했을때 서버로 get메소드 요청이 오고 응답으로 html파일을 넘겨줘야 홈페이지에 접속을 할 수 있듯이 말입니다.app.js파일안에 서버의 데이터를 요청하는 코드도 구성되어지는지 궁금합니다(fetch API를 이용해서 서버데이터를 가지고 오는 코드도 app.js 파일에 짜는게 맞는지 궁금합니다.)어떤틀을 가지고 웹페이지 코드가 구성이 이루어지는지 궁금합니다. 머리속에는 궁금점을 글로 쓸려니 어렵네요 .감사합니다.
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
res.render
res.render('test')이렇게만 했는데 어떻게 테스트파일을 경로를 찾아서 실행시키는지 궁금합니다.
- Node.js 교과서 - 기본부터 프로젝트 실습까지
데이터베이스를 어떻게 실행시키나요?
삭제된 글입니다
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
findAll시 model 질문
관계가 있는 테이블을 찾을 때 테이블을 model로 연결해주어야 한다고 하셨는데, User 테이블(강의 앞부분)에서의 User.findAll()은 model로 연결 안해주셨고 Comment.findAll 할때만 연결해주셨는데 왜 그런건가요?
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
오류 질문입니다!
(node:24348) [SEQUELIZE0004] DeprecationWaning: A boolean value was passed 이거 떠가지고 시퀄라이즈 버전을 4버전으로 바꿔주려는데.. 바꾸려고하면 Invalid tag name "@4.37.6": Tags may not have any characters that encodeURIComponent encodes 이렇게 오류떠서 바뀌지 않습니다.. 어떻게 하면 좋을까요
- 해결됨Node.js 교과서 - 기본부터 프로젝트 실습까지
deserialize 캐싱 구현 관련 질문.
안녕하세요~ deserialize 캐싱를 구현해보았습니다. 구현 하다보니 두가지 의문이 생겨 질문합니다. 우선 아래는 제가 구현한 코드 입니다. let users = [ ] ; passport.deserializeUser((id, done) => { let result = users.indexOf(id); if (result === -1) { // result가 -1이라면 === 배열에 아이디 없다. User.findOne({ where: { id } }) // 유저 아이디가 있는지 db에서 검색해라. .then((user) => done(null, user)) // 검색이 성공했다면, 결과를 파라미터에 .then(()=>users.push(id)) // 그리고 배열에 아이디를 추가해라. .catch((err) => done(err)); } else { // result가 -1이 아니라면, 배열안에 아이디가 있다. done(null,users[result]); } }); 테스트 해봤는데 일단은 동작이 됩니다. 제가 궁금한 것은 1. 배열의 indexof 함수가 동기인지, 비동기인지 입니다. 2. 유저가 로그아웃을 하거나 , 브라우저를 종료해도 배열안에 저장한 유저 아이디는 그대로 저장되어 있는데 , 혹시 위와 같은 상황에서 발생할 수 있는 문제점이 있을까요? ( 제 지식으로는 딱히 문제가 될 것 같지는 않은데, 강사님의 의견이 궁금합니다. )
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
프로젝트 구조, node_modules
안녕하세요. 강의 아주 아주 잘 듣고 있습니다. 현재 node 강의, react 웹게임 강의를 듣고 있고react 완강후 sns 만들기, typescript 강의도 들을려고 합니다. 그런데 궁금한게 있습니다. 웹게임 강의를 따라 실습하면서 구구단, 숫자야구 등등을 모두 별도의 디렉토리에 서 npm init 을 하고 react, react-dom, webpack, babel 등을 프로젝트 마다 설치해주고 있는데요.. 이렇게 작업을 하는게 맞는건가요? 다시말해 프로젝트 마다 패키지들을 설치하는게 낭비인듯 한데 노드 프로젝트 특성상 그렇게 하는 것인지 제가 몰라서 중복으로 프로젝트 마다 설치하고 있는 것인지 모르겠습니다. 실무에서는 어떻게 하는지, 프로젝트 마다 설치해주는 것이 맞는건지 궁금합니다. 답변 기다리겠습니다. 감사합니다.