6.1 익스프레스 프로젝트 시작하기
6.1.1 Express 소개
http 모듈로 웹서버를 만들 때 코드가 보기 좋지 않고, 확장성도 떨어짐
=> 프레임워크로 해결 (대표적인 것이 Express, Koa, Hapi)
=> 코드 관리도 용이하고 편의성이 많이 높아짐
6.1.2 package.json 만들기
직접 만들거나 npm init 명령어 생성
=> nodemon이 소스 코드 변경시 서버를 재시작해줌
npm i express
npm i -D nodemon
6.1.3 app.js 작성하기
서버 구동의 핵심이 되는 파일
· app.set('port', 포트) : 서버가 실행될 포트 지정
· app.get('주소', 라우터) : GET 요청이 올 때 어떤 동작을 할지 지정
· app.listen('포트', 콜백) : 몇 번 포트에서 서버를 실행할지 지정
const express = require('express');
const app = express();
app.set('port', process.env.PORT || 3000);
app.get('/', (req, res) => {
res.send('Hello, Express');
});
app.listen(app.get('port'), () => {
console.log(app.get('port'), '번 포트에서 대기 중');
});
6.1.4 서버 실행하기
· app.js : 핵심 서버 스크립트
· public : 외부에서 접근 가능한 파일들 모아둠
· views : 템플릿 파일을 모아둠
· routes : 서버의 라우터와 로직을 모아둠 (추후에 models를 만들어 데이터베이스 사용)
6.1.5 익스프레스 서버 실행하기
npm start (package.json의 start 스크립트) 콘솔에서 실행
6.1.6 HTML 서빙하기
res.sendFile로 HTML 서빙 가능
<!-- index.html -->
<html>
<head>
<meta charset="utf-8" />
<title>익스프레스 서버</title>
</head>
<body>
<h1>익스프레스 서버</h1>
<p>실행 중</p>
</body>
</html>
const express = require('express');
const path = require('path');
const app = express();
app.set('port', process.env.PORT || 3000);
app.get('/', (req, res) => {
res.sendFile(path.join(__dirname, 'index.html'));
});
app.listen(app.get('port'), () => {
console.log(app.get('port'), '번 포트에서 대기 중');
});
6.2 자주 사용하는 미들웨어
6.2.1 미들웨어
익스프레스는 미들웨어로 구성됨
=> 요청과 응답의 중간에 위치하여 미들웨어
· app.use(미들웨어)로 장착 (위에서 아래로 순서대로 실행됨)
· 미들웨어는 req, res, next가 매개변수인 함수
· req : 요청, res : 응답 조작 가능
· next()로 다음 미들웨어로 넘어감
const express = require('express');
const path = require('path');
const app = express();
app.set('port', process.env.PORT || 3000);
app.use((req, res, next) => {
console.log('모든 요청에 다 실행됩니다.');
next();
});
app.get('/', (req, res, next) => {
console.log('GET / 요청에서만 실행됩니다.');
next();
}, (req, res) => {
throw new Error('에러는 에러 처리 미들웨어로 갑니다.');
});
app.use((err, req, res, next) => {
console.error(err);
res.status(500).send(err.message);
});
app.listen(app.get('port'), () => {
console.log(app.get('port'), '번 포트에서 대기 중');
});