$ mkdir nodebird
$ npm init
$ npm i sequelize mysql2 sequelize-cli
$ npx sequelize init
// dev 로 nodemon 도 설치
$ npm i nodemon -D
템플릿 파일을 넣을 views 폴더, 라우터를 넣을 routes 폴더, 정적 파일을 넣을 public 폴더를 생성한다.
express, cookie-parser, express-session, morgan, multer, dotenv, nunjucks 모듈을 설치한다.
루트 폴더에 app.js 와 .env 파일을 만든다.
환경변수 설정을 위해 .env 파일을 작성한다.
COOKIE_SECRET = cookiesecret
const express = require("express");
const cookieParser = require("cookie-parser");
const morgan = require("morgan");
const path = require("path");
const session = require("express-session");
const nunjucks = require("nunjucks");
const dotenv = require("dotenv");
dotenv.config();
const pageRouter = require("./routes/page");
const app = express();
app.set('port', process.env.PORT || 8001);
app.set('view engine', 'html');
nunjucks.configure('views', {
express: app,
watch: true,
});
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('/', pageRouter);
app.use((req, res, next) => {
const error = new Error(`${req.method} ${req.url} 라우터가 없습니다.`);
error.status = 404;
next(error);
});
app.use((err, req, res, next) => {
res.locals.message = err.message;
res.locals.error = process.env.NODE_ENV !== 'production' ? err : {};
res.status(err.status || 500);
res.render('error');
})
app.listen(app.get('port'), () => {
console.log(app.get('port'), "번 포트에서 서버 대기 중");
});
이제 기본적인 라우터와 템플릿 엔진을 생성한다.
routes 폴더에 page.js를 만들고, views 폴더 안에 layout.html, main.html, profile.html, join.html, error.html 을 생성한다.
추가로 public 폴더도 만들고 main.css 를 넣었다.
(html 과 css 파일의 코드는 생략한다. github 참조)
아래는 routes 폴더의 page.js 의 내용이다.
const express = require("express");
const router = express.Router();
router.use((req, res, next) => {
res.locals.user = null;
res.locals.followerCount = 0;
res.locals.followingCount = 0;
res.locals.followerIdList = [];
next();
});
router.get('/profile', (req, res) => {
res.render('profile', { title: '내 정보 - SNSservice'});
});
router.get('/join', (req, res) => {
res.render('join', { title: '회원가입 - SNSservice'});
});
router.get('/', (req, res, next) => {
const twits = [];
res.render('main', {
title: 'SNSservice',
twits,
});
});
module.exports = router;