본문 바로가기
node.js

Express

by 루에 2019. 3. 13.
반응형

node.js 의 미들웨어 모듈 Express 나름대로 정리


Express가 할 수 있는 일의 단적인 예제


기존의

http.createServer(function (req, res) {
const method = req.method.toLowerCase();
switch(method){
// get 요청 처리 : 영화 목록 보기, 영화 상세정보 보기
// 영화목록보기 /movies
// 상세보기 /movies/1 or 2 or 3 ....
case 'get' :
handleGetRequest(req,res);
break;
// 영화 정보 추가 /movies
case 'post' :
handleSelectMethod(req, res);

function handlePutRequest(req, res){
console.log('call handlePutRequest()');
let buffer = '';
let result = {};
//영화 목록 추가
req.on('data', function(chunk){
buffer += chunk;
});
req.on('end', function(){
const parsed = JSON.parse(buffer);
result = { id : parsed.id, title : parsed.title, director : parsed.director, synopsis : parsed.synopsis};
for(let i=0; i<movieList.length; i++){
let item = movieList[i];
if(parsed.id == item.id){
item.title = parsed.title;
item.director = parsed.director;
item.synopsis = parsed.synopsis;
break;
}
}

처럼, 요청 메소드를 파싱하고, url및 querystring 모듈을 이용해 주소 및 get 파라미터를 파싱하고 request의 data, end 이벤트를 등록하여 인풋 데이터를 처리하는 과정을


const express = require('express');
const http = require('http');
const router = express.Router();

let app = express();
app.get('/',(req,res)=>{
res.send('get type, addr : / ' + req.path + ' ' + req.protocol);
});
app.post('/post', (req, res) => {
res.send('post type, addr : /post');
}


이렇게 간단한 방식으로 라우팅 할 수 있으며,


const express = require('express');
const morgan = require('morgan');
const winston = require('winston');

const app = express();
app.use(morgan('dev')); // 개발버젼으로 로그를 남기겠다

로그 모듈 및 기타 미들웨어 모듈을 use라는 함수를 이용하여 적용할 수 있고,


const express = require('express');
const bodyParser = require('body-parser');
const app = express();

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended : true}));
// app.use(express.urlencoded({extened:true}));
// app.use(express.json());

app.post('/movies', (req,res) => {
console.log(req.body);
let title = req.body.title;
let message = req.body.message;

res.send('title : ' + title + ' message : ' + message);
});


app.listen(3000);

bodyParser라는 강력한 바디 데이터(raw[json, xml, etc...], x-www-form-urlencoded, form-data) 파싱 능력을 갖춘 미들웨어 모듈도 사용할 수 있다.

보면 매우!넘나! 단순하고 명확해졌다.

단 body-parser는 multipart는 파싱할 수 없으므로, 그건 formidable 등의 모듈을 사용해야한다.


당연히 에러 처리 등도 다 가능하므로 타 프레임워크보다 심플하게 만들 수 있다는 강점.

express 4.6.1인가부터 body-parser를 기본 모듈에 포함되었다는 정보가 있었고, 위 예문에는 bodyParser.json(); 등으로 적용했으나 express.json(); 등으로 사용 가능하다(위 예문 주석)


그리고 모듈 이름은 생각이 나지 않는데, 요청 method를 변환해주는 모듈도 있다. 가령 get으로 들어온 걸 put으로 바꿔준다던지...

강좌가 짧게 지나가서 정확한 사용처 등은 나오지 않으나, 웹으로 restful api를 구성하는데 유용하게 사용될 것 같다.


또한 템플릿 엔진도 탑재하고 있다.

대표적으로 EJS, JADE


example


const express = require('express');
const app = express();

app.set('views', __dirname + '/views');
app.set('view engine', 'ejs'); // ejs templete engine
app.set('view engine', 'jade'); // jade templete engine

let data = [
{title : 'cat1', image : 'cat1.jpg'},
{title : 'cat2', image : 'cat2.jpg'},
{title : 'cat3', image : 'cat3.jpg'}
];

app.use(express.static('./'));
app.get('/jade', (req, res) => {
res.render('sports', {title : 'Cats', images : data });
});

app.get('/ejs', (req, res) => {
res.render('cats', {title : 'Cats', images : data });
});

app.listen(3000);


cats.ejs

<html>
<head>
<meta charset="UTF-8"/>
<title>ejs templete</title>
</head>
<body>
<h1><%= title %></h1>
<ul>
<% images.forEach((item) => { %>
<li><%= item.title %>
<img src="image/<%= item.image %> " style="width:100px;height:150px;"></li>
<% }); %>
</ul>
</body>
</html>

EL방식의 문서 작성. 확장자가 ejs인만큼 보통의 html과 조금 다른 문법도 가지고 있음


sports.jade

html
head
meta(charset="UTF-8")
title Jade example
body
- var varTest = '<strong>var test</strong>'    // 코드 사용
if varTest     // if는 - 안붙이고 사용
div varTest is true
else
div varTest is false
div!=varTest
div=varTest
div #{varTest}
div !{varTest}
h1=title
ul
for item in images
li
img(src="image/"+item.image style="height:200px;width:100px;")
span=item.title


JADE는 특수한 문법 사용. 어찌보면 복잡하고 어찌보면 단순하다. 뭐가 낫냐고 하면... 다른 프론트엔드 프레임워크 쓰는게 낫지 않을까.

반응형

댓글