express 21.05.06


https://expressjs.com/ko/

Express : 웹 및 모바일 애플리케이션을 위한 일련의 강력한 기능을 제공하는 간결하고 유연한 Node.js 웹 애플리케이션 프레임워크. 자유롭게 활용할 수 있는 수많은 HTTP 유틸리티 메소드 및 미들웨어를 통해 쉽고 빠르게 강력한 API를 작성 가능.

기본 세팅

  • 필요한 모듈 설치
<!-- npm 설치 -->
$ npm init

<!-- express 설치 + dependencies에 저장 -->
$ npm i express --save

<!-- nodemon 설치 -->
$ npm i nodemon --save
  • pakage.json : script 설정 및 실행
"scripts": {
    "start": "nodemon index.js", // 쌍따옴표로 작성
    "test": "echo \"Error: no test specified\" && exit 1"
  }
$ npm start // nodemon 실행

Hello World 예제

// express 모듈 불러오기
const express = require('express')
// express 실행문 변수에 담기
const app = express()
// port 지정
const port = 3000

// get 요청(URI를 통해 접속) + URI가 루트 디렉토리(/)인 경우
// 'Hello World' 응답(res) 보내기(send)
app.get('/', (req, res) => res.send('Hello World'))

// 서버 연결
app.listen(port, () => console.log(`Ex app listening at http://localhost:${port}`))
  • 실행
$ node start
<!-- Ex app listening at https://localhost:3000 -->

http://localhost:3000 접속 시 Hello World를 볼 수 있다.

기본 라우팅

라우팅 : URI(또는 경로) 및 특정한 HTTP 요청 메소드(GET, POST 등)인 특정 엔드포인트에 대한 클라이언트 요청에 애플리케이션이 응답하는 방법을 결정하는 것. 쉽게 말해 URI와 요청 메소드에 따라 분기 처리 (== if)

  • syntax
app.메소드(URI, 핸들러 함수)

// app은 express의 인스턴스다. app == express()
// 메소드 : HTTP 요청 메소드 (GET, POST, PUT, DELETE 등)
// URI : PATH. 서버의 경로
// 핸들러 함수 : 라우트가 일치(메소드와 URI가 일치) 시 실행되는 함수
  • ex code
// 홈페이지 접속(GET 요청)시 응답 Hello Express 
app.get('/', (req, res) => res.send('Hello Express!'))

// 루트 라우트에서 POST(업데이트) 요청에 응답
app.post('/', (req, res) => res.send('POST 요청을 받았다!'))

// user 라우트에서 PUT(수정) 요청 응답
app.put('/user', (req, res) => res.send('PUT 요청을 받았다!'))

// user 라우트에서 DELETE(삭제) 요청 응답
app.delete('/user', (req, res) => res.send('DELETE 요청을 받았다!'))

// 404 응답 처리 + 오류 핸들러 함수
app.use((err, req, res, next) => {
    console.error(err.stack);
    res.status(500).send('오류 발생!')
})
  • 라우트 URI에는 문자열, 문자열 패턴, 정규식으로 구성 가능
// 라우트 경로는 acd 및 abcd와 일치
app.get('/ab?cd', function(req, res) {
  res.send('ab?cd');
});

// 라우트 경로는 abcd, abbcd 및 abbbcd 등과 일치
app.get('/ab+cd', function(req, res) {
  res.send('ab+cd');
});

//  라우트 경로는 abcd, abxcd, abRABDOMcd 및 ab123cd 등과 일치
app.get('/ab*cd', function(req, res) {
  res.send('ab*cd');
});

// 라우트 경로는 /abe 및 /abcde와 일치
app.get('/ab(cd)?e', function(req, res) {
 res.send('ab(cd)?e');
});

// 라우트 경로는 라우트 이름에 “a”가 포함된 모든 항목과 일치
app.get(/a/, function(req, res) {
  res.send('/a/');
});

// 라우트 경로는 butterfly 및 dragonfly와 일치하지만, butterflyman 및 dragonfly man 등과 일치하지 않습니다.
app.get(/.*fly$/, function(req, res) {
  res.send('/.*fly$/');
});

라우트 핸들러

미들웨어와 비슷하게 작동하는 여러 콜백 함수를 제공하여 요청을 처리할 수 있다. 유일한 차이점은 이러한 콜백은 next(‘route’)를 호출하여 나머지 라우트 콜백을 우회할 수도 있다는 점이다. 이러한 메커니즘을 이용하면 라우트에 대한 사전 조건을 지정한 후, 현재의 라우트를 계속할 이유가 없는 경우에는 제어를 후속 라우트에 전달할 수 있다.

// 하나의 라우트 처리
app.get('/example/a', function (req, res) {
  res.send('Hello from A!');
});

// 2개이 상의 콜백함수를 하나의 라우트로 처리 : next()를 반드시 사용!

app.get('/example/b', function (req, res, next) {
  console.log('the response will be sent by the next function ...');
  next();
}, function (req, res) {
  res.send('Hello from B!');
});

// 하나의 콜백 함수 배열을 하나의 라우트를 처리
let cb0 = function (req, res, next) {
  console.log('CB0');
  next();
}

let cb1 = function (req, res, next) {
  console.log('CB1');
  next();
}

let cb2 = function (req, res) {
  res.send('Hello from C!');
}

app.get('/example/c', [cb0, cb1, cb2]);

// 독립적인 함수와 함수 배열의 조합은 하나의 라우트로 처리
let cb0 = function (req, res, next) {
  console.log('CB0');
  next();
}

let cb1 = function (req, res, next) {
  console.log('CB1');
  next();
}

app.get('/example/d', [cb0, cb1], function (req, res, next) {
  console.log('the response will be sent by the next function ...');
  next();
}, function (req, res) {
  res.send('Hello from D!');
});

응답 메소드

  • res.download() : 파일이 다운로드되도록 프롬프트
  • res.end() : 응답 프로세스를 종료합니다.
  • res.json() : JSON 응답을 전송합니다.
  • res.jsonp() : JSONP 지원을 통해 JSON 응답을 전송
  • res.redirect() : 요청의 경로를 재지정
  • res.render() : 템플릿 렌더링
  • res.send() : 다양한 유형의 응답을 전송
  • res.sendFile : 파일을 옥텟 스트림의 형태로 전송
  • res.sendStatus() : 응답 상태 코드를 설정한 후 해당 코드를 문자열로 표현한 내용을 응답 본문으로서 전송.

미들웨어

미들웨어 함수 : 요청(req) 객체, 응답(res) 객체, 그리고 애플리케이션의 요청-응답 주기 중 그 다음의 미들웨어 함수 대한 액세스 권한을 갖는 함수입니다. 그 다음의 미들웨어 함수는 일반적으로 next라는 이름의 변수로 표시.

미들웨어 함수 기능

  • 모든 코드를 실행.
  • 요청 및 응답 오브젝트에 대한 변경을 실행.
  • 요청-응답 주기를 종료.
  • 스택 내의 그 다음 미들웨어를 호출.

현재의 미들웨어 함수가 요청-응답 주기를 종료하지 않는 경우에는 next()를 호출하여 그 다음 미들웨어 함수에 제어를 전달해야함. 그렇지 않으면 해당 요청은 정지된 채로 방치.

미들웨어 구조

app.get('/', function(req, res, next) { next(); });

function() // 미들웨어 함수
get // 미들웨어 함수가 적용되는 HTTP Method
'/' // 미들웨어 함수가 적용되는 라우트(경로)
req // 미들웨어 함수에 대한 HTTP 요청 인자
res // 미들웨어 함수에 대한 HTTP 응답 인자
next // 미들웨어 함수에 대한 콜백 인수

미들웨어 구현 예시

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

// 미들웨어 함수
const myLogger = function (req, res, next) {
  console.log('LOGGED');
  next();
// 이 함수를 호출하면 앱 내의 그 다음 미들웨어 함수가 호출됩니다. 
// next() 함수는 Node.js 또는 Express API의 일부가 아니지만, 
// 미들웨어 함수에 전달되는 세 번째 인수.
};

// 미들웨어 사용법 : app.use(미들웨어 명) 
app.use(myLogger);
// 앱이 요청을 수신할 때마다, 앱은 “LOGGED”라는 메시지를 터미널에 인쇄

// 미들웨어의 로드 순서는 중요하며, 먼저 로드되는 미들웨어 함수가 먼저 실행.
// 만약 app.use(myLogger)가 app.get(~) 밑에 사용되면 실행되지 않는다
// app.get(~)에서 send로 응답을 보내고 종료하기 때문이다.

let requestTime = function (req, res, next) {
  req.requestTime = Date.now();
  next();
};

app.use(requestTime);

app.get('/', function (req, res) {
  res.send('Hello World!');
});

app.listen(3000);
미들웨어의 로드 순서는 중요하며, 먼저 로드되는 미들웨어 함수가 먼저 실행.

실제 미들웨어 사용

Express는 자체적인 최소한의 기능을 갖춘 라우팅 및 미들웨어 웹 프레임워크이며, Express 애플리케이션은 기본적으로 일련의 미들웨어 함수 호출

미들웨어 유형

애플리케이션 레벨 미들웨어
let app = express();

// 경로가 없는 미들웨어 함수 : app이 요청을 수신할 때마다 실행
app.use(function (req, res, next) {
  console.log('Time:', Date.now());
  next();
});

// 경로가 있는 미들웨어 함수 : 해당 경로 요청을 수신할 때마다 실행
app.use('/user/:id', function (req, res, next) {
  console.log('Request Type:', req.method);
  next();
});

// 메소드와 경로가 있는 미들웨어 함수 : 해당 메소드와 해당 경로의 요청을 수신할 때마다 실행
app.get('/user/:id', function (req, res, next) {
  res.send('USER');
});

app.use('/user/:id', function(req, res, next) {
  console.log('Request URL:', req.originalUrl);
  next();
}, function (req, res, next) { //  미들웨어 하위 스택
  console.log('Request Type:', req.method);
  next();
});
라우터 레벨 미들웨어

express.Router() 인스턴스에 바인드된다는 점을 제외하면 애플리케이션 레벨 미들웨어와 동일한 방식으로 작동

let router = express.Router();

let app = express();
let router = express.Router();

app을 router로 바꿔서 플리케이션 레벨 미들웨어에 있는 코드들 입력
오류 처리 미들웨어
app.use(function(err, req, res, next) {
  console.error(err.stack);
  res.status(500).send('Something broke!');
});
써드파티 미들웨어 사용법

써드파티 미들웨어 목록 : https://expressjs.com/ko/resources/middleware.html

  • 써드파티 미들웨어 설치
$ npm install cookie-parser
  • app.use(써드파티 미들웨어명())
let express = require('express');
let app = express();
let cookieParser = require('cookie-parser');

// load the cookie-parsing middleware
app.use(cookieParser());
// () 실행





© 2020.11. by creamer

Powered by CREAMer