* 위 내용을 정리하였음
- 익스프레스는 npm에서 제공하는 웹 서버 프레임워크이다.
- 익스프레스를 사용하면 더 이상 if문으로 요청 메서드와 주소를 구별하지 않아도 된다.
6.1 익스프레스 프로젝트 시작하기
- package.json을 만들고 express와 nodemon을 설치한다.
- scripts에 "start" : "nodemon app"을 적어준다. nodemon app을 하면 app.js를 nodemon으로 실행한다는 뜻이다. 서버 코드에 수정 사항이 생길 때마다 nodemon 모듈로 서버를 자동으로 재시작한다.
{
"name": "learn-express",
"version": "0.0.1",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "nodemon app"
},
"author": "jsdysw",
"license": "ISC",
"dependencies": {
"express": "4.17.2"
},
"devDependencies": {
"nodemon": "2.0.15"
}
}
- 서버 역할을 할 app.js를 만든다.
const express = require('express');
const path = require('path');
const app = express();
app.set('port', process.env.PORT || 3000);
app.get('/', (req, res) => {
// res.send('Hello, Express');
res.sendFile(path.join(__dirname, '/index.html'));
});
app.listen(app.get('port'), () => {
console.log(app.get('port'), '번 포트에서 대기 중');
});
- 익스프레스 내부에 http 모듈이 내장되어 있으므로 서버의 역할을 할 수 있다.
- app.set('port', 포트)로 서버가 실행될 포트를 설정
- app.get(주소, 라우터)는 주소에 대한 GET 요청이 올 때 어떤 동작을 할지 적는 부분이다.
- req는 요청에 관한 정보가 들어 있는 객체이고, res는 응답에 관한 정보가 들어 있는 객체이다. 현재 GET / 요청 시 응답으로 Hello, Express를 전송한다.
- 익스프레스에서는 res.write나 res.end 대신 res.send를 사용한다.
- sendFile로 index.html파일을 보내줄수도 있다.
- 파일의 경로를 path 모듈을 사용해서 지정한다.
- listen을 하는 부분은 포트를 연결하고 서버를 실행한다. 포트는 app.get('port')로 가져왔다.
6.2 자주 사용하는 미들웨어
- 미들웨어는 요청과 응답 중간에 위치하여 요청, 응답을 조작하거나 나쁜 요청을 걸러내기도 한다. app.use(미들웨어)꼴로 사용한다.
const express = require('express');
const path = require('path');
const app = express();
app.set('port', process.env.PORT || 3000);
app.use((req, res, next) => {
console.log('모든 요청에 다 실행됩니다.');
next();
});
app.get('/', (req, res, next) => {
console.log('GET / 요청에서만 실행됩니다.');
next();
}, (req, res) => {
throw new Error('에러는 에러 처리 미들웨어로 갑니다.')
});
app.use((err, req, res, next) => {
console.error(err);
res.status(500).send(err.message);
});
app.listen(app.get('port'), () => {
console.log(app.get('port'), '번 포트에서 대기 중');
});
- app.use에 매개변수가 req, res, next인 함수(미들웨어)를 넣으면 된다.
- 주소를 첫 번째 인수로 넣어주지 않는다면 미들웨어는 모든 요청에서 실행되고, 주소를 넣는다면 해당하는 요청에서만 실행된다.
app.use(미들웨어) | 모든 요청에서 미들웨어 실행 |
app.use('/abc', 미들웨어) | abc로 시작하는 요청에서 미들웨어 실행 |
app.post('/abc', 미들웨어) | abc로 시작하는 POST 요청에서 미들웨어 실행 |
- 미들웨어는 위에서부터 아래로 순서대로 실행되면서 요청과 응답 사이에 특별한 기능을 추가할 수 있다.
- next : 다음 미들웨어로 넘어가는 함수입니다. next를 실행하지 않으면 다음 미들웨어가 실행되지 않습니다.
- 위 예시의 app.get()처럼 두개의 미들웨어를 넣을 수도 있다.
- /요청이 들어오면 log를 띄우고 다음 미들웨어를 실행하도록 하는 미들웨어1, 에러를 던지는 미들웨어2 가 있다.
- 여기서 발생한 에러는 아래 에러 처리 미들웨어로 전달된다. (반드시 매개변수가 err, req, res, next로 네 개)
- 에러처리 미들웨어에서 res.status로 HTTP 상태코드를 지정하도록 했다.
- 에러처리 미들웨어는 반드시 맨 아래 위치하도록 하자.
- 이렇게 미들웨어로 요청, 응답에 다양한 기능을 추가할 수 있다.
npm i morgan cookie-parser express-session dotenv
- 위 패키지를 설치하고 app.js를 아래처럼 수정한다.
const express = require('express');
const morgan = require('morgan');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const dotenv = require('dotenv');
const path = require('path');
dotenv.config();
const app = express();
app.set('port', process.env.PORT || 3000);
app.use(morgan('dev'));
app.use('/', express.static(path.join(__dirname, 'public')));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(session({
resave: false,
saveUninitialized: false,
secret: process.env.COOKIE_SECRET,
cookie: {
httpOnly: true,
secure: false,
},
name: 'session-cookie',
}));
app.use((req, res, next) => {
console.log('모든 요청에 다 실행됩니다.');
next();
});
app.listen(app.get('port'), () => {
console.log(app.get('port'), '번 포트에서 대기 중');
});
- 아래내용의 .env파일을 만든다.
COOKIE_SECRET=cookiesecret
- 설치한 패키지들을 require한 후 app.use에 연결한다.
- 미들웨어 내부에 req, res, next 들이 다 들어있다.
- dotenv는 미들웨어는 아니고 .env를 읽어서 process.env로 만들어준다.
- 보안과 설정 편의를 위해 process.env를 별도의 파일로 관리한다.
- .env파일에 비밀 키를 적어두고 dotenv 패키지로 비밀 키를 로딩해서 사용한다.
- 소스코드가 유출되어도 .env만 잘 지키면 된다.
- 다음 글에서 각각의 미들웨어를 살펴보자.
'ComputerScience > NodeJs' 카테고리의 다른 글
node - 6.3 Router 객체로 라우팅 분리 ~ 6.4 req, res 객체 (0) | 2022.01.25 |
---|---|
node - 6.2 자주 사용하는 미들웨어 (0) | 2022.01.23 |
node - 5 Package Manager (0) | 2022.01.15 |
node - 4 http 모듈로 서버 만들기 (0) | 2022.01.12 |
node - 3.7 이벤트 이해하기 ~ 3.8 예외처리 (0) | 2022.01.09 |