$ npm i -g express-generator
$ express learn-express --view=pug
$ cd learn-express
$ npm install
$ npm start
npx 를 사용하여 글로벌 설치없이 코드 수정사항 즉시 반영하기
$ npx express learn-express --view=pug
$ cd learn-express
$ npm install
$ npx nodemon ./bin/www
var app = require('../app');
var debug = require('debug')('learn-express:server');
var http = require('http');
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
var server = http.createServer(app);
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);
요청과 응답의 중간에 위치하여 공통된 처리를 담당하는 로직.
app.use를 통해 사용.
app.use(function(req, res, next) {
console.log(req.url, '저도 미들웨어입니다.');
next();
})
const customizedMiddleware = (req, res, next) => {
console.log('req.url', '저도 미들웨어입니다.');
next();
}
app.use(customizedMiddleware());
app.use에 여러개의 미들웨어 입력 가능(가독성이 좋지 않아 비추천!)
const customizedMiddleware1 = (req, res, next) => {
console.log('첫 번째 미들웨어');
next();
}
const customizedMiddleware2 = (req, res, next) => {
console.log('두 번째 미들웨어');
next();
}
const customizedMiddleware3 = (req, res, next) => {
console.log('세 번째 미들웨어');
next();
}
app.use(customizedMiddleware1(), customizedMiddleware2(), customizedMiddleware3());
const logger = require('morgan');
app.use(logger('dev'));
사용시 인자로 dev 이외에 short, common, combined 입력 가능.
각 인자마다 콘솔에 표시되는 로그내용이 다름.
개발시에는 dev, short를 배포시에는 common, combined를 많이 사용.
const bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
const cookieParser = require('cookie-parser');
app.use(cookieParser());
req.cookie 에 클라이언트에서 전송된 쿠키를 확인 가능함.
정적 파일(public 폴더)을 제공.
자체적으로 정적 파일 라우터 기능을 수행하므로 최대한 위쪽에 배치를 권장.
app.use(express.static(path.join(__dirname, 'public')));
세션 관리용 미들웨어.
const session = require('exprsss-session');
app.use(session({
resave: false,
saveUninitialized: false,
secret: 'secret code',
cookie: {
httpOnly: true,
secure: false,
},
}));
일회성 메세지 작성
const express = require('express');
const router = express.Router();
router.get('/express', function(req, res, next) {
res.render('index', {title: 'Express'});
});
module.exports = router;
const learnRouter = require('./routes/learn');
app.use('/learn', learnRouter);
http://localhost:3000/learn/express 로 요청 가능
router.route('/express')
.get(function(req, res, next) {})
.put(function(req, res, next) {})
.post(function(req, res, next) {})
.delete(function(req, res, next) {})
router.get('/express/:name', function(req, res, next) {
console.log(req.params);
});
http://localhost:3000/learn/choiseolbeom 로 요청시
console.log(req.params); // choiseolbeom
router.get('/', function(req, res, next) {
console.log(req.query);
})
http://localhost:3000/learn?limit=5&skip=10 로 요청시
console.log(req.query); // {limit: '5', skip: '10'}
query에 한글포함시
querystring을 사용하여 stringify후 query 활용
const qs = require('querystring');
const query = {
limit: '다섯개',
skip: '열개',
};
const stringifiedQuery = qs.stringify(query);
console.log(stringifiedQuery) // 'limit=%EB%8B%A4%EC%84%AF%EA%B0%9C&skip=%EC%97%B4%EA%B0%9C'
const parsedQuery = qs.parse(query);
console.log(parsedQuery); // {limit: '다섯개', skip: '열개'}
한 개의 요청에 한개의 응답만 가능
jade로 알려진 pug는 문법이 간단하여 코드의 양이 줄어드는 장점이 있어 인기가 많음.
html 과는 문법이 많이 달라 호불호가 갈림.
doctype html
html
head
title= title
link(rel='stylesheet', href='/stylesheets/style.css')
ejs는 html문법을 그대로 사용하고 자바스크립트 문법을 사용 가능
<h1><%= title %></h1>
<p>Welcome to <%= title %></p>
<button class="<%= title%>" type="submit">전송</button>
<input placeholder="<%= title + '연습' %>">/>