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
조합으로 사용하기에 express
가 tomcat
이라고 생각하면 될 것 같네요. 사실, 이렇게 생각하는게 제일 위험하긴 하지만, 비슷하게 생각하면 될듯하다..혹은 express
는 spring 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');
});
'프로그래밍 > Nodejs' 카테고리의 다른 글
Volta?! (JavaScript command line tool) (0) | 2022.01.13 |
---|---|
[정리] 모던 웹을 위한 Node.js 프로그래밍 3/4장 (0) | 2018.02.08 |
생활코딩 - Server Side JavaScript 4 (0) | 2016.05.10 |
생활코딩 - Server Side JavaScript 3 (0) | 2016.05.10 |
생활코딩 - Server Side JavaScript 2 (0) | 2016.04.26 |