app.js 3.38 KB
const path = require('path');
const morgan = require('morgan');
const express = require('express');
//header Cookie : 쿠키, 해쉬함수
//오리지널 >> 해쉬 >> 압축메세지

const cookieParser = require('cookie-parser');
const expressSession = require('express-session');
const passport = require('passport');
const httpErrors = require('http-errors');
const dotenv = require('dotenv');
dotenv.config();
const MongoStore = require('connect-mongo')(expressSession);
const MONGO_URL = `mongodb://localhost:27017/admin`;
const cors = require('cors');


const {sequelize} = require('./models/index');
sequelize.sync({force: false});
const connect = require('./schemas/index');
connect();

const sessionMiddleware = expressSession({
    resave: false,
    saveUninitialized: false,
    secret: process.env.COOKIE_SECRET,
    cookie: {
        httpOnly: true,
        secure: false
    },
    name: 'userChecker',
    store: new MongoStore({
        url: MONGO_URL,
        collection: "sessions"
    }),
});

const passportIndex = require('./passport/index');
const userRouter = require('./routes/user');
const apiRouter = require('./routes/api');

passportIndex(passport);


// const app = express(); 사용 설명서
// app.use(미들웨어)
// 미들웨어란: (req, res, next) => {req와 res를 분석 및 가공, next로 req와 res를 다음 미들웨어로 전달}
// 따라서 미들웨어끼리의 순서가 중요하다

// 어떤 미들웨어에서 req에 변수를 등록하고, 다음 미들웨어에서 그 변수를 가져다가 사용하는 방법
// 1. req.set()으로 변수를 등록하고, req.get()으로 전역 변수들을 가져와서 사용할 수 있다
// 2. app.set()으로 변수를 등록하고, req.app.get()으로 전역 변수들을 가져와서 사용할 수 있다(req 객체에 app 객체는 자동으로 세팅된다)
// 3. req.app.set()으로 변수를 등록하고, req.app.get()으로 전역 변수들을 가져와서 사용할 수 있다

// res 사용법
// 오리지날: res.writeHead, res.write, res.end
// 익스프레스 프레임워크: res.render('view 파일 이름', 자바스크립트 변수 객체), res.send(아무거나), res,json(객체), res.redirect('경로'), res.sendFile,

const app = express(); // 익스프레스 프레임워크를 사용하기 위한 app 객체를 생성

app.use(morgan('dev')); // 로거를 미들웨어 최상단에 위치시켜서 서버로 들어오는 모든 요청에 대한 로그를 콘솔에서 확인

app.use(cors({
    origin: 'http://localhost:3001',
    credentials: true
}));
app.use(express.json());
app.use(express.urlencoded({extended: false}));
app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(sessionMiddleware);

app.use(passport.initialize()); // 패스포트 작동 시작
app.use(passport.session()); // 패스포트 세션 작업


app.use('/public', express.static(path.join(__dirname, 'open'))); // 모두에게 공개된 폴더 설정
app.use('/user', userRouter);
app.use('/api', apiRouter);


app.use(function (req, res, next) {
    next(httpErrors(404));
});
app.use(function (err, req, res, next) {
    // set locals, only providing error in development
    console.log(req);
    res.locals.message = err.message;
    res.locals.error = req.app.get('env') === 'development' ? err : {};

    //render the error pagea
    res.status(err.status || 500);
    res.render('error');
});

module.exports = {
    app,
    sessionMiddleware
};