Express Framework : 기본적으로 해야할 작업들을 대신 해주는 프레임 워크
서버 사이드 로직을 만드는 것은 복잡하다. 들어오는 request를 받고 분류해야하고 더 많은 작업들이 있다. 이 작업들을 간소화하고 비지니스 로직을 더 견고화 하기 위해 Express를 사용한다.
-
npm i --save express -
app.js에 express 가져오기
const express = require('express');
미들웨어는 들어오는 request를 분류하는 기능을 가진 함수다.
st=>start: Request
op1=>operation: Middleware ( (req, res, next) -> {...} )
op2=>operation: Middleware ( (req, res, next) -> {...} )
op3=>operation: Response
st->op1->op2->op3
Request를 받고 Response 를 돌려줄때 까지 미들웨어를 거친다. 한개를 거칠 수 도 있고 여러개를 거칠 수 도 있다.
-
미들웨어 구조
app.use((req, res, next) => { console.log('In the Middleware'); next(); // 다음에 있는 미들웨어로 넘어감 });
-
작동방식
const http = require('http'); const express = require('express'); const app = express(); app.use((req, res, next) => { console.log('In the Middleware'); next(); // next가 없으면 아래 라우터로 가지 못한다. }); app.use((req, res, next) => { res.send('<h1>Hello from Express!<h1>'); //express 에서는 Header에 Default 값으로 text/html 을 보내준다. }); const server = http.createServer(app); server.listen(3000);
-
서버를 만들기 위해 express를 사용할 수 있음.
// const server = http.createServer(app); // server.listen(3000); app.listen(3000)
-
경로 설정
const express = require('express'); const app = express(); app.use('/add-product', (req, res, next) => { res.send( '<form action="/product" method="POST"><input type="text name="title><button type="submint">Add Product</button></form>' ); }); app.use('/product', (req, res, next) => { console.log(req.body); res.redirect('/'); }); app.use('/', (req, res, next) => { res.send('<h1>Hello from Express!<h1>'); console.log('last'); }); app.listen(3000);
-
body-parser
$ npm i --save body-parserconst bodyParser = require('body-parser') app.use(bodyParser.urlencoded({ extended: false })); // 이렇게 사용해야 값을 키 밸류 값으로 받는다.
-
Post 요청 과 Get 요청 구별하기
app.use() // 모든 요청을 받을 수 있음 app.post() // get을 통한 (URL 을 입력해서) 접근 통제 app.get()
Express에 존재하는 Router 함수를 사용하면 파일로 프로젝트를 관리할 수 있다.
-
app.js
const express = require('express'); const bodyParser = require('body-parser'); const app = express(); const adminRoutes = require('./routes/admin'); // 불러오기 const shopRoutes = require('./routes/shop'); app.use(bodyParser.urlencoded({ extended: false })); app.use(adminRoutes); //adominRouts() x app.use(shopRoutes); app.listen(3000);
-
routes/amdin.js
const express = require('express'); const router = express.Router(); router.get('/add-product', (req, res, next) => { res.send( '<form action="/product" method="POST"><input type="text" name="title"></input><button type="submint">Add Product</button></form>' ); }); router.post('/product', (req, res, next) => { console.log(req.body.title); res.redirect('/'); }); module.exports = router; // 모듈화 시킴
-
routes/shop.js
const express = require('express'); const router = express.Router(); router.get('/', (req, res, next) => { res.send('<h1>Hello from Express!<h1>'); console.log('last'); }); module.exports = router;
-
404 페이지 만들기
이후 없는 페이지를 작성 하기 위해 404 페이지를 만들 수 있다. 기존에는 모든 요청이
'/'로 갔다.const express = require('express'); const bodyParser = require('body-parser'); const app = express(); const adminRoutes = require('./routes/admin'); const shopRoutes = require('./routes/shop'); app.use(bodyParser.urlencoded({ extended: false })); app.use(adminRoutes); //adominRouts() x app.use(shopRoutes); // 미들웨어는 위에서 아래로 진행하므로 404 페이지는 맨 아래 작성! app.use((req, res, next) => { res.status(404).send('<h1>Page Not Found :('); }); app.listen(3000);
-
Express 에서 제공하는 url 필터
라우터를 불러올 때 URL 로 필터를 설정 할 수 있다. 필터를 설정하게 되면 라우터에서는 다시 적을 필요가 없다.
app.use(adminRoutes); // URL: http://localhost:3000/abc app.use('/admin', adminRoutes); // URL: http://localhost:3000/admin/abc
views 폴더에 html 파일을 만들어 클라이언트에게 보내주기
-
routes/shop.js
const path = require('path'); const express = require('express'); const router = express.Router(); router.get('/', (req, res, next) => { // windws 와 Lunux 에서 경로 설정이 다르므로 경로에 /나 \를 사용하지 않는다. res.sendFile(path.join(__dirname, '../', 'views', 'shop.html')); }); module.exports = router;
res.sendFile(path.join(__dirname, '../', 'views', 'shop.html'));
일반적으로 프로젝트를 배포하면 파일들은 사용자가 접근할 수 없다. 하지만 public 폴더에 정적 파일들은 접근 가능하다. 따라서 여기에 들어가는 파일들을 잘 관리해야 한다.
-
app.js 에 아래 추가
app.use(express.static(path.join(__dirname, 'public')));