수강이 제한됩니다.
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
matchedUrl 정의할 때
const matchedUrl = router[req.method][req.url](matchedUrl || router[req.method]['*'])(req, res);보통 객체에서 키 값을 불러올 때는 . 을 사용하잖아요.[]는 보통 배열에서 사용되고?왜 저런식으로 사용됐는지 이해가 잘 안됩니다.또 matchedUrl 정의가 (req, res) 까지인가요?그렇다면 const 정의할 때 옵션을 정해준거랑 비슷한건가요?
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
한글입력이 안됩니다
전에도 드렸던 질문인데 반복드려서 죄송합니다.작동은 모두 잘 되는데 한가지회원가입때 닉네임 정할시에도 영어로 하지 않으면 에러가 나고 영어로 가입후게시글에 글쓸때에나 해쉬태그 쓸때에도 한글로만 쓰면 에러가 나는데전에 말씀하신 것처럼 마지막장에 배포할때에는 한글로 입력되게끔 세팅을 하는거고단지 여기서는 연습이기때문에 안되는건가요?선생님 영상을 보면 한글로 잘 되셔서 저희이해를 돕기위해일단 선생님만 그렇게 설정을 해놓으신 건지 궁금해서 글남깁니다!!
- 해결됨Node.js 교과서 - 기본부터 프로젝트 실습까지
외래키 질문드립니다.
1:N관계로 설정하는데~ (사실 동영상 강의는 안보고 책으로 하다가 오류가나서 질문드립니다.)model/index.js에 db.User.hasMany(db.Comment, {foreignkey:'commenter', sourceKey:'id'});db.Comment.belongsTo(db.User, {foreignkey:'commenter', targetKey:'id'});를 넣잖아요?생성은 잘되는데 코멘트 입력시에 외래키로 지정된 commenter 에 id값이 입력이 안되네요..생성된 테이블(comment)을 확인해보면 외래키로 userId가 생성되어있구요.router/comment.jsrouter.post('/', function(req, res, next) { Comment.create({ commenter: req.body.id, userId: req.body.id, <--이거 추가 comment: req.body.comment, }) .then((result) => { console.log(result); res.status(201).json(result); }) .catch((err) => { console.error(err); next(err); });});<--이거 추가를 해야지만 외래키에 입력이 들어가는데 어디서 잘못이 된걸까요?commenter가 자동으로 외래키 입력이 되야 하지 않나요?혹시 mariadb를 사용해서 발생하는 문제일까요?mariadb에서는 사용 방법이 어떻게 될까요?
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
안녕하세요 회원가입시에 닉네임
회원가입시에 닉네임을 영어가 아닌 한글로 입력하니 에러메시지가 뜨는데이유를 모르겠습니다.닉네임을 영어로 가입하면 워크벤치에서도 가입들어온거 정상적으로 확인가능하고 정상작동하는데한글로 가입하게 되면 아래와 같은 에러가 뜹니다그리고 일반 이메일 가입이나 로그인이 아닌 카카오톡 버튼 클릭시에도 아래와 같은 에러가 뜹니다코드는 동영상보면서 똑같이 입력했고, 혹시나 해서 책과같이 봤는데 원인을 못찾겠습니다...SequelizeDatabaseError: Incorrect string value: 'xEDx98xB8xEBx9ExAD...' for column 'nick' at row 1at Query.formatError (C:testnicenode_modulessequelizelibdialectsmysqlquery.js:247:16)at Query.handler [as onResult] (C:testnicenode_modulessequelizelibdialectsmysqlquery.js:68:23)at Query.execute (C:testnicenode_modulesmysql2libcommandscommand.js:30:14)at Connection.handlePacket (C:testnicenode_modulesmysql2libconnection.js:455:32)at PacketParser.onPacket (C:testnicenode_modulesmysql2libconnection.js:73:18)at PacketParser.executeStart (C:testnicenode_modulesmysql2libpacket_parser.js:75:16)at Socket. (C:testnicenode_modulesmysql2libconnection.js:80:31)at emitOne (events.js:116:13)at Socket.emit (events.js:211:7)at addChunk (_stream_readable.js:263:12)at readableAddChunk (_stream_readable.js:250:11)at Socket.Readable.push (_stream_readable.js:208:10)at TCP.onread (net.js:597:20)
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
궁금한 점이있습니다.
1, schemas 디렉토리에 user.js 맨밑에 module.exports = mongoose.model('User', userSchema); 이코드가 어떤식으로 동작하는건가요..?? 몽구스에 모델객체에 User의 값으로 userSchema를 추가하기때문에, 나중에 유저를 등록하는 요청을보낼때 new User를 할수있어지는것인가요??? 2, 처음 localhost:3000 으로 접속할때 유저정보가 출력되는것은 이해가 되는데 유저를 새로 능록할때 routes 디렉토리안에 있는 users.js 파일에 router.post('/', (req, res, next)=>{ ... } 라우터에 걸리는 이유가뭔지모르겠습니다... 새로운 사용자를 등록할때 users.js 파일에 post에 걸리려면 url주소가 localhost:3000/user/ + post요청 이였을때 routes/users.js 파일에있는 post요청에 걸려야하지않나요???
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
참조 변수에 대해 질문드립니다.
const obj = { a: 1, b: 2,}obj2 = obj와 같은 코드가 있을 때 obj2는 obj를 참조하는 참조 변수이고, obj의 값을 따라간다는 것을 알고 있습니다.대개 다른 프로그래밍 언어에서는 obj2를 변경할 경우에 obj에는 영향을 주지 않고 obj의 값이 obj2에 영향을 주는 것으로 알고 있었는데 자바스크립트에서 테스트해보니 obj2에서 값을 변경하거나 추가해도 obj에 똑같이 반영이 되는것을 확인할 수 있었습니다. (제가 잘못 알고 있는 것일수도 있습니다.)그렇다면 참조형 변수를 사용하는 의미가 없지 않나요? 아니면 참조형 변수만을 독립적으로 사용할 수 있는 방법이 있는지 궁금합니다.또한 예시 코드처럼 단순히 저런 참조형 변수를 사용한다면 어떤 목적에서 사용하는지도 알고 싶습니다.
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
객체 리터럴의 변화 부분에서 질문이 있습니다.
객체 리터럴에서 동적으로 값을 할당할 때 var es = 'ES'var obj = { [es + 6] = 'value'}해당 부분에서 어떻게 obj.ES6처럼 사용될 수 있는건지 궁금합니다.es가 변수의 역할을 하고 + 로 6과 함께 ES6라는 key의 역할을 하는 것으로 보이는데es 변수가 가진 값은 'ES'라는 문자열이고 6은 상수인데 ES6가 아닌 es6로 호출해야 하지 않나라는 궁금증이 생깁니다.리터럴에 이런식으로 값을 할당하는 것은 처음봐서 이해가 잘 되지 않는데 질문이 조금 난해하더라도 이해 부탁드립니다!
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
express에 들어오면서 문법과 관련돼서 궁금한 점이 있습니다
express에서 생성한 파일들은 es5문법으로 생성 되었고, 제로초님은 파일을 새로 작성할 때 es6로 작성하고 계십니다.한 파일에서 혼용되는 것이 아니라면 문법을 혼용해서 사용해도 서버를 구동하는데 별 차이가 없는 것인가요? 갑자기 소소하게 궁금해져서 질문합니다 : )
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
카카오 로그인 관련 질문드립니다.
안녕하세요..카카오 로그인 관련 질문 드립니다..기존 로그인 방식은 사용자 테이블에서 email 주소로 사용자가 등록되어 있는지를 찾는 것이고,카카오 로그인 방식은 사용자 프로필을 받아 거기서 받은 snsid를 기반으로 사용자 가 등록되어 있는지를 확인하는 방식으로 이해했습니다..그런데... 카카오 로그인 방식은 사용자 창에서 받는 이메일 주소와 비밀번호는 어디서 사용하는지 궁금합니다.. 지금은 임의의 값을 넣어도 .env에설정된 Client_ID를 가지고 사용자 profile을 가져오는 듯 하네요...(제가 코드를 빼먹은게 있는지??^^;;)확인 부탁드리겠습니다..
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
user.js 관련 문의
안녕하세요..user.js 관련 문의 드립니다.해당 서버를 실행 시키면 다음과 같은 오류가 발생합니다.PS D:nodejsch06learn-sequelize> npm startlearn-sequelize@0.0.0 start D:nodejsch06learn-sequelizenode ./bin/wwwsequelize deprecated String based operators are now deprecated. Please use Symbol based operators for better security, read more at http://docs.sequelizejs.com/manual/tutorial/querying.html#operators node_modulessequelizelibsequelize.js:242:13Executing (default): CREATE TABLE IF NOT EXISTS users (id INTEGER NOT NULL auto_increment , name VARCHAR(20) NOT NULL UNIQUE, age INTEGER UNSIGNED NOT NULL, married TINYINT(1) NOT NULL, comment TEXT, created_at DATETIME NOT NULL DEFAULT now(), PRIMARY KEY (id)) ENGINE=InnoDB;**Unhandled rejection SequelizeDatabaseError: Invalid default value for 'createdat'at Query.formatError (D:nodejsch06learn-sequelizenodemodulessequelizelibdialectsmysqlquery.js:247:16)***at Query.handler [as onResult] (D:nodejsch06learn-sequelizenode_modulessequelizelibdialectsmysqlquery.js:68:23)at Query.execute (D:nodejsch06learn-sequelizenode_modulesmysql2libcommandscommand.js:30:14)at Connection.handlePacket (D:nodejsch06learn-sequelizenode_modulesmysql2libconnection.js:455:32)at PacketParser.onPacket (D:nodejsch06learn-sequelizenode_modulesmysql2libconnection.js:73:18)at PacketParser.executeStart (D:nodejsch06learn-sequelizenode_modulesmysql2libpacket_parser.js:75:16)at Socket. (D:nodejsch06learn-sequelizenode_modulesmysql2libconnection.js:80:31)at Socket.emit (events.js:182:13)at addChunk (_stream_readable.js:283:12)at readableAddChunk (_stream_readable.js:264:11)at Socket.Readable.push (_stream_readable.js:219:10)at TCP.onStreamRead [as onread] (internal/stream_base_commons.js:94:17)create_at 컬럼의 defaultValue 설정을 막으면 정상 실행되며, DB에도 정상 반영되는 것을 확인했습니다... 제가 defaultValue 설정에 잘못된점 있는지 확인 부탁드립니다..(책 소스 복사한 것이라 오타는 없을 것으로 판단됩니다 ^^;;)
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
sequelize 데이터베이스 관계설정 오류
현재 학교에서 Node.js를 이용하여 프로젝트를 진행하고 있습니다.서버를 만들고 있는데 데이터베이스의 테이블을 정의하여 관계연결을 하고 실행을 시켰습니다.sequelize deprecated String based operators are now deprecated. Please use Symbol based operators for better security, read more at http://docs.sequelizejs.com/manual/tutorial/querying.html#operators node_modulessequelizelibsequelize.js:242:13D:test_PPLmodelsindex.js:26db.User.hasMany(db.Portfolio, { foreignKey: 'user_id', sourceKey: 'id' });다음과 같은 오류가 발생하는데 도움받고 싶습니다.모델을 연결하는 index.js 부분에서 다음과 같이 sequelize를 선언했습니다.const sequelize = new Sequelize( config.database, config.username, config.password, config, {operatorsAliases: false}, );
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
에러 때문에 질문드려여
에러 때문에 질문드려여 실행(fast) C:fast_ajaxnpm_startlearn-sequelize>npm start에러 내용learn-sequelize@0.0.0 start C:fast_ajaxnpm_startlearn-sequelizenode ./bin/wwwsequelize deprecated String based operators are now deprecated. Please use Symbol based operators for better security, read more at http://docs.sequelizejs.com/manual/tutorial/querying.html#operators node_modulessequelizelibsequelize.js:242:13crypto.js:99this._handle.update(data, encoding);^TypeError: Data must be a string or a bufferat Hash.update (crypto.js:99:16)at sha1 (C:fast_ajaxnpm_startlearn-sequelizenode_modulesmysql2libauth_41.js:31:8)at Object.token [as calculateToken] (C:fast_ajaxnpm_startlearn-sequelizenode_modulesmysql2libauth_41.js:65:18)at new HandshakeResponse (C:fast_ajaxnpm_startlearn-sequelizenode_modulesmysql2libpacketshandshake_response.js:28:26)at ClientHandshake.sendCredentials (C:fast_ajaxnpm_startlearn-sequelizenode_modulesmysql2libcommandsclient_handshake.js:51:31)at ClientHandshake.handshakeInit (C:fast_ajaxnpm_startlearn-sequelizenode_modulesmysql2libcommandsclient_handshake.js:137:12)at ClientHandshake.execute (C:fast_ajaxnpm_startlearn-sequelizenode_modulesmysql2libcommandscommand.js:39:22)at Connection.handlePacket (C:fast_ajaxnpm_startlearn-sequelizenode_modulesmysql2libconnection.js:455:32)at PacketParser.onPacket (C:fast_ajaxnpm_startlearn-sequelizenode_modulesmysql2libconnection.js:73:18)at PacketParser.executeStart (C:fast_ajaxnpm_startlearn-sequelizenode_modulesmysql2libpacket_parser.js:75:16)at Socket. (C:fast_ajaxnpm_startlearn-sequelizenode_modulesmysql2libconnection.js:80:31)at emitOne (events.js:116:13)at Socket.emit (events.js:211:7)at addChunk (_stream_readable.js:263:12)at readableAddChunk (_stream_readable.js:250:11)at Socket.Readable.push (_stream_readable.js:208:10)at TCP.onread (net.js:597:20)npm ERR! code ELIFECYCLEnpm ERR! errno 1npm ERR! learn-sequelize@0.0.0 start: node ./bin/wwwnpm ERR! Exit status 1npm 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:UsershyunsepkAppDataRoamingnpm-cache_logs2018-11-21T11_28_01_102Z-debug.log
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
Express에서 MVC 패턴에 관해 질문이 있습니다
죄송합니다 질문이 좀 기네요..ㅠㅠ 제가 MVC 패턴에 대한 개념이 잘 잡히지 않아, 제로초님 서적에서 읽어보니 router 미들웨어가 MVC패턴 중 controller 역할을 해주고, 실제 강의 프로젝트 코딩 상에서 봤을 때도 아래와 같은 패턴으로 router.get('/post',async (req,res)=>{ .. USER.findOne({where ...}) }) 라우터 함수 안에 모델들을 불러와 쿼리를 실행하는 것으로 배웠고, 실제로도 그렇게 코딩을 하고 있었는데, 오늘 문득 위와 같은 코딩 패턴이 Controller와 Model이 분리가 된 것인가라는 저 스스로 궁금증이 생기더라구요. 1)라우터 미들웨어 자체가 Controller 역할을 하는 것이 맞는지 여부와 2)위와 같은 코딩 패턴이 M,C를 분리한 패턴이 맞는지 3)서버 사이드 렌더링이 아닌, 뷰를 보여주는 프론트엔드(?)서버와 DB에 접근하는 백엔드 서버가 나뉘어져 있는 방식일 때, Controller 역할을 하는 곳은 프론트 서버인지 백엔드 서버인지 4)Router안에 로직들이 너무 길어질 때는 보통 어떤식으로 코드를 모듈화하는 패턴을 가지는 지 궁금합니다.
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
한 개의 MySQL DB에 여러 서버가 Connection
이미 한개의 서버에서 MySQL 데이터 베이스에Sequelize 모델 정의로 테이블들이 정의된 상태에서,또 하나의 Express 서버가 해당 MySQL 데이터 베이스에 Sequelize로 접근하려면어떻게 해야 될까요??제가 알아본 결과 모델 정의를 못하기에 ORM을 사용못하고 SQL 쿼리문을 사용해야만한다고 알고 있는데,혹시 모델 define을 하지 않고, Sequelize ORM을 사용할 방법이 있을까요?
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
DB서버의 ajax 통신 속도가 너무 느려요
주어진 소스 코드 그대로 실행하면 유저 등록이랑 댓글 등록이 정상적으로 이루어지긴 하는데유저 등록과 해당 유저의 글을 보는 것이 2 ~ 3초정도 걸립니다.혹시나 해서 컴퓨터를 다시 껏다 켜봐도, 현재 실행중인 다른 프로그램을 모두 끄고 했는데도 동영상에처럼 응답이 바로바로 처리되질 않네요...이전에 apache php mysql 에서 ajax 연습 해본 적이 있었는데 이렇게 오래 걸리지 않았거든요.이런 경우 무엇이 문제인지 ... 혹시 해결 방법이 있을 까요?
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
index.js 질문입니다.
moduel.export = () =>{ const connect = () =>{ ... } connect(); mongoose.connection.on('error', (error)=>{ //연결에러이벤트 ... }); mongoose.connection.on('disconnected', (error)=>{ // 연결 끊어지면 재시도 이벤트 ... connect(); }); //연결 후 schema 불러오기 require('./user'); require('./comment'); } 안녕하세요, 강좌에서는 위와 같이 하셨는데, 연결 재시도 이벤트에 대해 질문입니다. 연결이 끊어지면 재시도 할때 disconnected 이벤트를 받아 그 안에서 connect() 가 실행될 텐데 require() 로 user 와 comment 스키마를 불러오는 코드도 같이 와야 하는 거 아닌가요 ? 이렇게요... mongoose.connection.on('disconnected', (error)=>{ // 연결 끊어지면 재시도 이벤트 ... connect(); require('./user'); <-- 추가 require('./comment'); <--추가 });
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
458페이지 질문입니다!
const io = req.app.get('io');io.of('/room').emit('newRoom', newRoom);res.redirect(/room/${newRoom._id}?password=${req.body.password});} catch (error) {console.error(error);next(error);}});router.get('/room/:id', async (req, res, next) => {try {const room = await Room.findOne({ _id: req.params.id });이부분중에 res.redirect(/room/${newRoom._id}?password=${req.body.password});이렇게 하면아래에 있는 get('/room/:id')코드가 실행되서 방이 만들어지는거죠?근데 res.redirect(/room/${newRoom._id}?password=${req.body.password});이 코드를 실행해서 방을 만들면 ._id 외에도 ?password= 부분이 주소에 붙어 있는데어떻게 get('/room/:id')로 접근할 수 있는건가요?
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
rest와 restful개념이 궁금해서요
rest문법에 모두 부합하게 사용하면 restful이라고 부르는건가요???
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
질문있습니다!
내용이 어려워서 이해하기 힘든데 이번 강의 넘기고다음 강의부터 진행해도 상관없나요?ㅜㅜ그리고 api서버는 나중에 홈페이지를 만들어서 운영할때필수인가요?
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
Main.pug 파일에 과 정적파일에 관한 질문입니다.
※파일 전체의 코드는 질문 하단에 있습니다. 안녕하세요. 항상 최고의 node.js 강좌 잘 듣고 있습니다. 질문은 두개 입니다.main.pug 파일을 보면 다음과 같은 부분이 있습니다. [].forEach.call(document.querySelectorAll('.twit-follow'), function (tag) {tag.addEventListener('click', function () {[] 부분이 이해가 안갑니다. 빈 리스트를 forEach 하는게 어떻게 가능한지요. "변수".forEach라면 모르겠는데...이 부분에는 어떤 값이 어떻게, 언제 오기에 저 문법이 가능한지 알고 싶습니다. 정적파일은 기왕이면 다른 미들웨어들 위에 두라고 하신 부분이 이해가 잘 되지 않습니다.예를 들어, app.use(morgan('dev'));app.use(express.static(path.join(__dirname, 'public')));app.use('/img', express.static(path.join(__dirname, 'uploads')));app.use(express.json());app.use(express.urlencoded({ extended: false }));app.use(cookieParser(process.env.COOKIE_SECRET));위와 같은 코드에서 morgan 뒤쪽에 static middleware 를 위치 시켜서, 다른 미들웨어들이 불필요하게 사용되지 않게 해서 자원을 아끼라고 말씀하셨습니다. 그러나, 미들웨어들은 일단 실행되면 (next() 가 있다는 가정하에, 에러가 없다면) 순서대로 마지막 미들웨어까지 계속 나가야 하는것 아닌가요? 결국 위에 위치시키나, 아래 위치시키나 다른 미들웨어들을 실행하는건 마찬가지 같은데요. a) express.static은 next()가 없는 건가요?b)만약 express static이, 다음 미들웨어를 실행하지 않고 저기서 끝난다면, app.js 파일을 사용할 때마다 모든 요청이 전부 express.static 에서 끝나 버릴텐데, 그럼 json, eurlencoded, cookieParser 등등도 사용할 수 없게 되는 거 아닐까요?혹시 express.static은 특정 요청에만 응답하고, 일반적인 요청에는 응답을 안하는 기능이 있는 건가요? 그렇다고 하면, 결국 이 명령어를 상위에 위치시킬 필요는 없는것 같은데요.main.pug 파일 -----------extends layoutblock content .timeline if user 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') div label#img-label(for='img') 사진 업로드 input#img(type='file' accept='image/*') button#twit-btn.btn(type='submit') 짹짹 .twits form#hashtag-form(action='/post/hashtag') input(type='text' name='hashtag' placeholder='태그 검색') button.btn 검색 for twit in twits .twit input.twit-user-id(type='hidden' value=twit.user.id) input.twit-id(type='hidden' value=twit.id) .twit-author= twit.user.nick -const follow = user && user.Followings.map(f => f.id).includes(twit.user.id); if user && user.id !== twit.user.id && !follow button.twit-follow 팔로우하기 .twit-content= twit.content if twit.img .twit-img img(src=twit.img alt='섬네일') script. if (document.getElementById('img')) { document.getElementById('img').addEventListener('change', function (e) { var formData = new FormData(); console.log(this, this.files); formData.append('img', this.files[0]); var xhr = new XMLHttpRequest(); xhr.onload = function () { if (xhr.status === 200) { var url = JSON.parse(xhr.responseText).url; document.getElementById('img-url').value = url; document.getElementById('img-preview').src = url; document.getElementById('img-preview').style.display = 'inline'; } else { console.error(xhr.responseText); } }; xhr.open('POST', '/post/img'); xhr.send(formData); }); } [].forEach.call(document.querySelectorAll('.twit-follow'), function (tag) { tag.addEventListener('click', function () { var isLoggedIn = document.querySelector('#my-id'); if (isLoggedIn) { var userId = tag.parentNode.querySelector('.twit-user-id').value; var myId = isLoggedIn.value; if (userId !== myId) { if (confirm('팔로잉하시겠습니까?')) { var xhr = new XMLHttpRequest(); xhr.onload = function () { if (xhr.status === 200) { location.reload(); } else { console.error(xhr.responseText); } }; xhr.open('POST', '/user/' + userId + '/follow'); xhr.send(); } } } }); });app.js 파일입니다. const express = require('express');const cookieParser = require('cookie-parser');const morgan = require('morgan');const path = require('path');const session = require('express-session');const flash = require('connect-flash');const passport = require('passport');require('dotenv').config();const pageRouter = require('./routes/page');const authRouter = require('./routes/auth');const postRouter = require('./routes/post');const userRouter = require('./routes/user');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 || 8001);app.use(morgan('dev'));app.use(express.static(path.join(__dirname, 'public')));app.use('/img', express.static(path.join(__dirname, 'uploads')));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('/', pageRouter);app.use('/auth', authRouter);app.use('/post', postRouter);app.use('/user', userRouter);app.use((req, res, next) => { const err = new Error('Not Found'); err.status = 404; next(err);});app.use((err, req, res) => { 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'), '번 포트에서 대기중');});