프로그래밍/Nodejs

[책] 모던 웹을 위한 Node.js 프로그래밍 8장 정리

seungdols 2018. 2. 22. 14:22

Node.js 8장 - Express

npm install express

8.1 기본 서버

var express = require('express');

var app = express();

app.use(function (request, response) {
 response.writeHead(200, { 'Content-Type': 'text/html' });
 response.end('<h1>Hello express</h1>');
});


app.listen(52273, function () {
 console.log("Server Running at http://127.0.0.1:52273");
});

http모듈을 사용하지 않는 이유는 무엇일까?

그것은 바로 express모듈이 더 많은 기능을 포함하고 있기 때문이다. 사실, express는 모듈이기도 하지만, 프레임워크라고 생각하면 더 쉽다. express 프레임워크와 모듈로의 기능은 다르다고 생각 하는게 맞는 것 같다. express 모듈을 사용만 할때는 약간의 라이브러리 개념이지만, 프레임워크로써는 IoC 개념이 들어가므로 프레임워크라고 생각하면 좋을 것 같다.

8.2 기본 응답 메서드

var express = require('express');

var app = express();

app.use(function (request, response) {
 response.writeHead(200, { 'Content-Type': 'text/html' });
 response.end('<h1>Hello express</h1>');
});

app.listen(52273, function () {
 console.log("Server Running at http://127.0.0.1:52273");
});

.use를 보면 request, response 객체를 얻을 수 있는데 다양한 기능이 존재한다.

reponse객체에는 send, json, jsonp, redirect 메서드가 존재한다.

각각 어떻게 응답할지에 대한 메서드이다.

참고 : jsonp

var express = require('express');

var app = express();

app.use(function (request, response) {
   var output = [];
   for (var i = 0; i < 3; i++) {
       output.push({
           count: i,
           name: 'name - ' + i
      });
  }

   //response.send(output);
   response.status(200).send(output);
});

app.listen(52273, function () {
   console.log('Server running at http://127.0.0.1:52273');
});

위 결과는 json 객체가 뿌려지게 된다.

send메소드 앞에 status를 붙여서 상태코드를 전달 할 수 있다.

8.3 기본 요청 메서드

메서드 이름설명
params라우팅 매개변수 추출
query요청 매개변수 추출
headers요청 헤더를 추출
header()요청 헤더의 속성을 지정 또는 추출
accepts(type)요청 헤더의 Accept속성을 확인
is(type)요청 헤더의 Content-Type 속성을 확인

var express = require('express');

var app = express();

app.use(function (request, response) {
   var agent = request.header('User-Agent');
   console.log(request.headers);
   console.log(agent);

   response.sendStatus(200);
});

app.listen(52273, function () {
   console.log('Server running at http://127.0.0.1:52273');
});

User-Agent를 뽑아내는 예제로 웹브라우저로 요청할 경우 해당 정보가 출력 된다.

8.3.2 요청 매개변수 추출

var express = require('express');

var app = express();

app.use(function (request, response, next) {
   var name = request.query.name;
   var region = request.query.region;

   response.send('<h1>' + name + '-' + region + '</h1>');
});

app.listen(52273, function () {
   console.log('Server running at http://127.0.0.1:52273');
});

name, region를 추출 하는데, query 속성을 사용합니다.

8.4 미들웨어

http모듈과 express 모듈로 만든 서버의 큰 차이점은 use()를 사용하는데 있습니다.

더군다나, use()여러번 사용이 가능합니다. function(request, response, next){} 3개의 인자를 받는 함수를 use()에 넣어줍니다.

var express = require('express');

var app = express();

app.use(function (request, response, next) {
   console.log("first middleware");
   next();
});

app.use(function (request, response, next) {
   console.log("two middleware");
   next();
});

app.use(function (request, response, next) {
   console.log("third middleware");

   response.writeHead(200, { 'Content-Type': 'text/html' });
   response.end('<h1>express Basic</h1>');
});

app.listen(52273, function () {
   console.log('Server running at http://127.0.0.1:52273');
});

이를 보고 use()메서드의 매개변수에 입력하는 함수를 미들웨어라고 부른다고 합니다.

이렇게 하는 이유는 재사용이 가능하게 만들고, 해당 미들웨어를 분리 시키기 위함입니다.

expressjs middleware를 참고하시면 좋습니다.

8.5 router 미들웨어

var express = require('express');

var app = express();

app.get('/a', function (request, response) {
   response.send('<a href="/b">Go to B</a>');
});
app.get('/b', function (request, response) {
   response.send('<a href="/a">Go to A</a>');
});
app.get('/c/:id', function (request, response) {
   var id = request.params.id;
   response.send('<a href="/a">'+ id +'</a>');
});

app.listen(52273, function () {
   console.log('Server running at http://127.0.0.1:52273');
});

page 라우팅 처리도 되고, 매개변수 추출도 가능합니다.

특히, *로 전체 선택 지정도 가능합니다. 모든 요청에 대한 처리라고 볼 수 있습니다. 일종의 필터?로 써먹을 수 있지 않을까 생각해보았다. 아니면, 인터셉터?(...아닌가...역시 여전히 러닝커브는 긴 개발자인것 같다. )

8.7 morgan 미들웨어

npm install morgan

var express = require('express');
var morgan = require('morgan');

var app = express();

app.use(morgan('combined'));
app.use(function (request, response) {
   response.send('<h1>express Basic</h1>');
});

app.listen(52273, function () {
   console.log('Server running at http://127.0.0.1:52273');
});

서버 요청에 대한 로그를 남길 수 있습니다. 다만, 실제 적용시에는 앞단에 nginx를 두기도 합니다.

일반적인 스프링WebMVC 프레임워크를 쓸 경우 httpd + tomcat 조합으로 사용하기에 expresstomcat이라고 생각하면 될 것 같네요. 사실, 이렇게 생각하는게 제일 위험하긴 하지만, 비슷하게 생각하면 될듯하다..혹은 expressspring WebMVC framework와 비슷한 레벨이라고 생각해도 될 것 같다. 다만, 스프링 프레임워크는 컨테이너를 띄울 수 있는 tomcat같은 녀석이 필요로 한 거고.. express는 자체적으로 띄워버리는 것이니...이를테면 springboot와 같은 느낌이기도 하다. (느낌적인 느낌으로 넘어가면 될듯.)

8.9 Body parser 미들웨어

var fs = require('fs');
var express = require('express');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var app = express();
app.use(cookieParser());
app.use(bodyParser.urlencoded({ extended: false }));

app.get('/', function (request, response) {
   if (request.cookies.auth) {
       response.send('<h1>Login Success</h1>');
  } else {
       response.redirect('/login');
  }
});

app.get('/login', function (request, response) {
   fs.readFile('login.html', function (error, data) {
       response.send(data.toString());
  });
   // response.send('<h1>Login </h1>');
});

app.post('/login', function (request, response) {
   var login = request.body.login;
   var password = request.body.password;

   console.log(login, password);
   console.log(request.body);

   if (login == 'seungdols' && password == '1234') {
       response.cookie('auth', true);
       response.redirect('/');
  } else {
       response.redirect('/login');
  }
});

app.listen(52273, function () {
   console.log('Server running at http://127.0.0.1:52273');
});

반응형