상세 컨텐츠

본문 제목

[node.js] Express

Server/node.js

by 클리엘 클리엘 2021. 3. 5. 23:26

본문

728x90

1. 설치

 

node.js에서 express모듈은 웹서버를 만들 수 있도록 해줍니다. express모듈은 외부 모듈이므로 다음과 같이 설치합니다.

 

npm install express

그리고 임의의 js파일을 만들어 express모듈의 서버를 구동할 수 있도록 합니다. 여기서는 작성할 파일명을 test.js로 하겠습니다.

var express = require('express');

var server = express();

server.listen(8080, function() {
	console.log('Welcome to server!');
});

require('express')로 모듈을 추출한 다음 listen메서드로 서버 구동을 시작합니다.

 

node test.js

예제를 위해 node.js를 설치한 서버는 윈도우서버입니다. test.js파일 내용을 보면 포트를 8080으로 설정했으므로 서버에서는 8080 포트로 접속할 수 있게끔 포트를 열어줘야 합니다. 예제에서는 8080을 사용했지만 포트번호는 49981처럼 임의로 잡아도 무관합니다. 참고적으로 포트는 0~65535까지 설정할 수 있습니다.

 

포트를 열기 위해서는 우선 다음과 같이 방화벽설정을 열어서 설정을 잡아줘야 합니다.

 

Inbound Rules(인바운드 규칙)에서 오른쪽에 New Rule을 선택합니다.

 

Port(포트)를 선택합니다.

 

포트는 8080을 지정합니다.

 

Allow the connection(연결허용)을 선택합니다.

 

선택되어 있는 상태 그대로 진행합니다.

 

Name(이름)을 임의로 입력합니다.

 

이렇게 방화벽 규칙을 추가하면 이제 8080포트를 통해 서버에 접근할 수 있게 됩니다.

 

방화벽 설정을 끝내고 브라우저를 통해 접근해 보겠습니다.

 

현재 서버는 아무런 기능이 없기에 저런 에러가 나오는게 아닌가 싶습니다. 서버로 접근할 때 간단한 메시지를 표시하기 위해 파일을 다음과 같이 수정해 보겠습니다. js파일이 수정되면 node는 새로 구동되어야 합니다.

var express = require('express');

var server = express();

server.listen(8080, function() {
	console.log('Welcome to server!');
});

server.use(function (request, response) {
	response.send('<p>환영합니다.</p>');
});

use 메서드를 통해 서버로 접근이 이루어지면 '환영합니다.'라는 문구를 응답하도록 하였습니다.

 

use메서드는 다음과 같이 여러개 사용될 수 있습니다.

var express = require('express');

var server = express();

server.listen(8080, function() {
	console.log('Welcome to server!');
});

server.use(function (request, response, next) {
	console.log('first');
	next();
});

server.use(function (request, response, next) {
	console.log('second');
	next();
});

server.use(function (request, response) {
	console.log('third');

	response.send('<p>세번째 입니다.</p>');
});

혹은 메서드 체이닝을 활용할 수도 있습니다.

var express = require('express');

var server = express();

server.listen(80, function() {
    console.log('Welcome to server!');
});

server.use(function (request, response, next) {
    console.log('first');
    next();
}, function (request, response, next) {
    console.log('second');
    next();
}, function (request, response) {
    console.log('third');

    response.send('<p>세번째 입니다.</p>');
});

만약 사용자가 서버에 접근하면 위에서 사용된 use순서대로 처리되며 이때 next매개변수는 다음 함수로의 이동을 의미합니다.

 

first부터 third까지 두번씩 접근한 것으로 표시되어 있는데 이는 웹브라우저가 파피콘을 자동으로 요청하면서 생기는 현상입니다.

 

서버를 실행하기 위해 node <파일명>의 형식으로 서버를 실행했는데 서버 프로그램의 파일이 바뀌면 여전히 서버를 재시작해야 하는 불편함이 있습니다. 이를 해소하기 위해 다음과 같이 nodemon을 설치하고 nodemon을 통해 서버를 구동합니다.

npm install -g nodemon

 

nodemon의 가장큰 이점은 서버파일이 변경되면 서버를 수동으로 재시작할 필요없이 알아서 서버를 재시작해준다는 것입니다.


2. Express 서버구동

 

Express의 기본 구조는 다음과 같습니다.

const express = require('express');

const app = express();

app.get('', function(req, res) {
    res.send('<h1>cliel</h2>');
});

app.post('/data', function(req, res) {
    //
});

app.listen(80, function() {
    console.log('서버 실행중...');
});

express 모듈을 가져와 하나의 서버를 할당받습니다. 서버는 listen으로 포트번호와 함께 실행하며 get이나 post와 같은 전송방식을 URL경로와 함께 설정하면 클라이언트가 해당 주소로 요청했을때 응답을 처리하게 됩니다.

 


3. 파일 응답하기

 

Express에서 파을 응답하려면 sendFile함수를 사용합니다.

app.get('/', function(req, res) {
    res.sendFile('/root/wsl/index.html');
});

실제 위 함수를 통해 파일응답을 시도해 보니 파일에 대한 경체경로를 다 줘야만 실행이 가능했습니다. 만약 파일응답이 필요할때 해당 경로를 모두 지정해 줘야 하는 상황이라면 일일이 전체경로를 모두 찍어주는 대신 __dirname값을 통해 현재 경로를 사용해 줄 수 있습니다.

app.get('/', function(req, res) {
    res.sendFile(`${__dirname}/index.html`);
});

4. 미들웨어

 

각요청에서 처리되는 함수를 미들웨어라고 합니다.

app.use(function(req, res, next) {
    console.log('모든 요청에서 처리');
    next();
});

app.get('/', function(req, res) {
    res.sendFile(`${__dirname}/index.html`);
});

함수를 express의 use에 붙였습니다. use는 모든 요청을 받는 부분으로 제일 위에 위치해 두면 서버가 요청을 받을때마다 가장먼저 실행할 수 있습니다. 다만 use에서도 '/login'처럼 라우트를 붙일 수 있는데 이때는 /login요청에 대해서만 응답할 수 있게 됩니다.

 

이러한 특성을 이용해 use를 다른 라우트 가장 밑에 위치해 둔다면 자연스럽게 404처리도 가능하게 됩니다.

app.get('/', function(req, res, next) {
    res.sendFile(`${__dirname}/index.html`);
});

app.use(function(req, res) {
    res.send('404');
});

이는 클라이언트의 요청이 어떤 라우트에서도 받을 수 없는 경우라면 마지막에 use가 받기 때문인데 이런 404처리 이외에 다른 에러처리에서도 미들웨어가 사용될 수 있습니다.

app.get('/', function(req, res, next) {
    res.sendFile(`${__dirname}/index.html`);
    throw new Error('에러');
});

express는 내부에서 에러가 발생하면 위와 같이 알아서 에러를 처리해 줍니다. 하지만 이런 에러메세지를 모든 클라이언트가 볼 수 있다는게 문제인데 그래서 다음과 같이 에러를 받아 따로 처리해 주는 전용미들웨어를 정의하기도 합니다.

app.use(function(err, req, res, next) {
    console.error(err);
    res.send('에러가 발생하였습니다.');
});

예제에서는 throw new Error()를 사용해 고의적으로 에러를 내고 있는데 흔히 처리하는 방법으로는 try ~ catch를 사용합니다. 이런 경우 next() 에서 err객체를 매개변수로 하여 에러전용 미들웨어로 해당객체를 전달할 수 있습니다.

app.get('/', function(req, res, next) {
    try {
        res.sendFile(`${__dirname}/index.html`);
    }
    catch (err) {
        next(err);
    }
});

use를 보면 함수 마지막에 next()를 붙여 다음 라우트로 처리를 넘기고 있습니다. next()를 하지 않으면 다음 라우트에서 요청을 받을 수 없게 되는데 이런 특성을 이용해 중복되는 라우트를 정의하여 하나의 함수가 아닌 여러 함수로 처리를 나눌 수 있습니다.

app.get('/', function(req, res, next) {
    res.sendFile(`${__dirname}/index.html`);
    console.log('/ 요청에 대한 첫번째 처리');
    next();
});

app.get('/', function(req, res) {
    console.log('/ 요청에 대한 두번째 처리');
});

혹은 미들웨어끼리 체인을 구성해 위와 동일한 작동방식을 만들 수도 있습니다. (next()가 있어야 됨에 주의해 주세요.)

app.get('/', function(req, res, next) {
    res.sendFile(`${__dirname}/index.html`);
    console.log('/ 요청에 대한 첫번째 처리');
    next();
},
function(req, res) {
    console.log('/ 요청에 대한 두번째 처리');
});

만약 동일한 라우트가 존재할때 다른 하나의 라우트에서 체인을 구성하고 next()를 하면 다음 체인으로 연결된 미들웨어로 처리가 넘어가지만 next('route')와 같이 route매개변수를 붙여 next()를 호출하게 되면 현재 라우트를 즉시 빠져나와 다음 라우트로 처리가 넘어가게 됩니다.

app.get('/', function(req, res, next) {
    res.sendFile(`${__dirname}/index.html`);
    console.log('/ 요청에 대한 첫번째 처리');
    next('route');
},
function(req, res) {
    console.log('/ 요청에 대한 두번째 처리');
});

app.get('/', function(req, res) {
    console.log('/ 요청에 대한 세번째 처리');
});

따라서 위 예제의 경우에는 '요청에 대한 첫번째 처리'다음에 '요청에 대한 세번째 처리'를  console로 출력하게 됩니다.

 

다만 여러개의 미들웨어를 통해 요청에 대한 처리를 진행한다고 하더라도 사용자에게 응답할 수 있는건 sendFile()이나 send()등 한번만 응답할 수 있다는 점에 주의해야 합니다.

 

use와 비슷하게 URL부분에 *을 붙여 모든 요청을 받아들이도록 하는 경우가 있습니다.

app.get('*', function(req, res, next) {
    res.sendFile(`${__dirname}/index.html`);
});

이 예제는 모든 get요청에 응답하도록 처리한 것인데 use는 get이나 port같은 요청과는 관련없이 모든 요청에 대해 응답하지만 get('*')은 모든 get요청에만 응답한다는 차이가 있습니다.

 

http에서는 응답할때마다 200이나 404등의 응답코드를 전송합니다. 지금까지의 예제에서는 응답코드를 따로 주지 않았는데 이는 생략이 가능하기 때문입니다. 응답코드의 기본값은 200이며 만약 특정한 응답코드를 줘야 한다면 응답함수를 호출하기전 status함수를 통해 응답코드를 지정해 줄 수 있습니다.

app.get('/', function(req, res, next) {
    res.status(200).sendFile(`${__dirname}/index.html`);
});

header또한 별도로 지정이 필요하다면 setHeader() 함수나 writeHead() 함수를 사용해 직접 header값을 지정할 수 있습니다.

 

마지막으로 미들웨어는 필요한 경우 특정 데이터값을 굥유하기도 합니다. 만약 abc라는 내용의 데이터를 공유하고자 한다면

app.use((req, res, next) => {
    req.data = 'abc';
    next();
});

미들웨어에 위와 같이 req.data로 값을 설정하고

app.get('/test', function(req, res, next) {
    console.log(req.data);
    res.send('<h1>response</h1>');
});

다른 미들웨어에서 값을 그대로 가져오면 됩니다. 이렇게 공유되는 값은 해당 사용자한테만 공유되는 값이며 사용자에게 응답이 완료되면 값은 초기화 됩니다. 따라서 모든 사용자에게 전역적으로 값을 공유하고자 한다면 app.set()을 사용하거나 let변수를 사용하면 됩니다.


5. 기타 미들웨어

 

(1) morgan

 

mogan은 요청과 응답에 대한 내역을 실시간으로 확인할 수 있게 합니다.

npm i mogan

위와 같이 설치한 후 코드에 다음과 같이 mogan을 설정합니다.

app.use(morgan('dev'));

보시는 바와 같이 어느 경로에 어느요청이 있었는지, 응답시간, 응답데이터크기등을 바로 확인할 수 있습니다.

 

다른 옵션으로 'dev' 대신 'combined'로 설정할 수 있는데 dev보다 더 자세한 정보를 표시해 줍니다.

 

(2) cookie-parser

 

손쉽게 쿠키값을 가져오거나 설정할 수 있습니다. cookie-parser는 다음과 같이 설치하며

npm i cookie-parser

설치가 완료되면 아래처럼 사용설정을 해줍니다.

const express = require('express');
const cookie = require('cookie-parser');

const app = express();

app.use(cookie);

설정 이 후 쿠키를 사용하기 위해서는 cookie() 함수를 사용하고

app.get('/', function(req, res, next) {
    res.sendFile(`${__dirname}/index.html`);

    res.cookie('id', 'cliel', {
        expires: null,
        httpOnly: true,
        path: '/'
    });
});

설정한 쿠키값을 확인하려면 req.cookies를 사용합니다. 또한 쿠키를 삭제하려면 clearCookie() 함수를 사용할 수 있습니다.

app.get('/', function(req, res, next) {
    res.sendFile(`${__dirname}/index.html`);

    console.log(req.cookies.id);
    
    res.clearCookie('id', {path: '/'})
});

만일 보안상의 이유로 암호화가 필요하다면 쿠키사용설정시 키에 해당하는 임의의 문자열을 설정하고

app.use(cookie('cliel.com'));

쿠키를 생성할때 signed 옵션을 true로 주면 암호화된 값을 쿠키값으로 설정할 수 있습니다.

res.cookie('id', 'cliel', {
    expires: null,
    httpOnly: true,
    path: '/',
    signed: true
});

단, 암호화된 쿠키값을 확인하려면 req.signedCookies.id 처럼 signedCookies로 값을 확인해야합니다.

 

(3) body-parser

 

body-parser는 더이상 별도의 모듈로 사용되지 않고 express내부에 포함되었습니다. 따라서 설치과정도 생략됩니다.

app.use(express.urlencoded({ extended: true }));

위와 같이 설정을 잡고나면 필요한 데이터는 다음처럼 읽을 수 있습니다.

app.post('/data', (req, res) => {
    console.log(req.body.id);
    res.send('<h1>response</h1>');
});

만약 json형태의 데이터를 다뤄야 한다면 app.use(express.json()) 처럼 설정할 수 있습니다.

 

(4) static

 

'실제 요청경로와 응답하는 파일의 위치가 다른경우 + 요청에 의한 정작파일 제공' 기능을 제공하는 모듈입니다. express내장 모듈로서 다음과 같이 설정합니다.

app.use('/user', express.static(path.join(__dirname, 'login')));

위와 같이 해두면 사용자가 /user/login.html 을 요청했을때 실제로는 login디렉토리안에 있는 login.html파일을 읽어 응답하게 되는 것입니다.

 

만약 요청하는 파일이 지정한 디렉토리에 발견하지 못한 경우는 자동으로 next()를 호출해 다음 라우트로 넘어가게 됩니다.

 

(5) session

 

세션은 다음과 같이 설치합니다.

npm i express-session

세션을 설치하고나면 세션 사용을 위한 설정을 해줍니다.

const express = require('express');
const session = require('express-session');

const app = express();
app.set('port', 80);

app.use(session({
    resave: false,
    saveUninitialized: true,
    secret: 'cliel.com',
    name: 'cliel-session'
}));

설정할때의 옵션에서 resave는 세션에 수정사항이 없어도 다시 저장할지 여부를 나타내며 saveUninitialized는 세션에 저장할 내용이 없더라도 null값으로 세션쿠키를 저장할지 여부를 나타냅니다. secret에는 세션쿠키가 저장될때 필요한 암호화키이며 name은 저장되는 세션쿠키값의 이름입니다.

app.get('/', function(req, res, next) {
    req.session.displayName = 'cliel';
    req.session.save();
    res.sendFile(`${__dirname}/index.html`);
});

app.get('/test', function(req, res, next) {
    res.send(`<h1>${req.session.displayName}</h1>`);
});

세션을 저장할때는 'session.[이름] = 값' 형태로 저장하며 가져올때도 session.[이름] 으로 값을 확인할 수 있습니다. 다만 session.id는 사용해서는 안됩니다. id는 세션의 고유ID 값이 저장되어 있으므로 값을 설정한다고 해도 값을 가져오게 되면 고유ID값이 표시될뿐 저장한 값은 확인할 수 없습니다.

 

참고로 세션을 삭제할때는 session.destory() 함수를 호출해 모든 세션을 제거할 수 있습니다.

 

(6) multer

 

multer는 파일 업로드시 사용할 수 있는 모듈입니다. multer는 다음과 같이 설치하며

npm i multer

아래와 걑이 multer를 사용하기 위한 설정을 진행합니다.

const fs = require('fs');
const multer = require('multer');

const app = express();
app.set('port', 80);

try {
    fs.readdirSync('uploads');
}
catch {
    fs.mkdirSync('uploads');
}

const uploader = multer({
    storage: multer.diskStorage({
        destination(req, file, done) {
            done(null, 'uploads/');
        },
        filename(req, file, done) {
            done(null, file.originalname);
        }
    }),
    limits: { fileSize: 5 * 1024 * 1024 }
});

우선 fs를 통해 업로드한 파일이 저장될 디렉토리를 확인하고 없으면 생성합니다. 아래 설정부분에서 사용된 storeage는 파일저장소에 관한 설정으로 diskStorage를 통해 위에서 생성한 업로드폴더를 지정해 주고 filename으로 업로드된 파일이 어떤 파일명으로 저장될지를 설정합니다.

 

filename에서 중복되는 경우를 고려해야 한다면 시간이나 사용자 ID등을 붙여서 적절하게 처리해야 합니다. 업로드되는 파일이 이미 존재한다면 해당 파일을 덮어쓸 수 있기 때문입니다. 마지막으로 linits를 통해 업로드가능한 최대 파일크기를 지정하며 에제에서는 5MB로 제한하였습니다.

 

예제를 테스트해보기 위해 다음과 같이 이미지 업로드 가능한 html파일(file.html)을 만들고

<!DOCTYPE html>
<html>
<head>
	<title>파일전송 테스트</title>
</head>
<body>
	<form action='/upload' method="post" enctype="multipart/form-data">
		<input type="file" name="file" />
		<br />
		<button type="submit">업로드</button>
	</form>
</body>
</html>

업로드가 처리될 라우트를 작성하여 위에서 설정한 uploader를 라우트에 설정합니다.

app.get('/', function(req, res, next) {
    res.sendFile(`${__dirname}/file.html`);
});

app.post('/upload', uploader.single('file'), function(req, res) {
    console.log(req.file);
    res.send('uploaded!!');
});

single('file')에서 file은 위에서 만들어둔 html파일에서 업로드하는 파일태그의 name입니다. 이처럼 업로드하고자 하는 필드의 이름을 맞춰야 합니다.

 

업로드 이후에는 req.file을 사용해 업로드된 파일의 상세정보를 확인할 수 있습니다.

 

조금전 라우트에서 uploader를 붙여줄때 single('file')로 처리했는데 single는 말그대로 단일 파일에 대한 업로드를 의미합니다. 만약 아래와 같이 여러개의 파일이 업로드되도록 multiple이 지정된 경우

<body>
	<form action='/upload' method="post" enctype="multipart/form-data">
		<input type="file" name="file" multiple />
		<br />
		<button type="submit">업로드</button>
	</form>
</body>

uploader에서는 single이 아닌 array로 지정해야 하며

app.post('/upload', uploader.array('file'), function(req, res) {
    console.log(req.files[0]);
    console.log(req.files[1]);
    res.send('uploaded!!');
});

이때 각각의 파일은 files[0]..files[1] 처럼 구분되서 처리됩니다.

 

다중 파일을 업로드하는건 위와 같이 mulple을 지정해 업로드하는 대신 아예 업로드할 필드를 여러개 만들어 한까번에 올리는 경우도 있습니다.

<body>
	<form action='/upload' method="post" enctype="multipart/form-data">
		<input type="file" name="file1" />
		<input type="file" name="file2" />
		<input type="text" name="title" />
		<br />
		<button type="submit">업로드</button>
	</form>
</body>

이럴때는 array가 아닌 fields를 사용해 배열객체를 붙여 업로드되어오는 파일의 POST값을 하나씩 지정해 줘야 합니다.

app.post('/upload', uploader.fields([{name : 'file1', limits : 3}, {name : 'file2'}]), function(req, res) {
    console.log(req.files.file1);
    console.log(req.files.file2);
    console.log(req.body.title);

    res.send('uploaded!!');
});

참고로 파일과 함께 전송되는 일반 필드값은 body로 받습니다.

 

(7) dotenv

 

dotenv는 node.js프로젝트에 필요한 공통변수나 중요키들, 설정값같은것들을 하나의 파일에 모아두고 환경변수처럼 사용할 수 있도록 합니다.

 

dotenv는 다음과 같이 설치합니다.

npm i dotenv

dotenv를 설치했으면 프로젝트 디렉토리에 .env라는 파일 하나를 생성하고

 

다음과 같은 내용을 파일에 저장합니다. 아래 내용은 MY_KEY와 URL이라는 환경변수를 생성하는 것입니다.

MY_KEY = 123456env
URL = cliel.com

저장 후 위에서 설정한 환경변수를 불러오기 위해 다음과 같이 dotenv를 설정하여

const dotenv = require('dotenv');

dotenv.config();

값을 불러오면 됩니다.

app.get('/test', function(req, res, next) {
    res.send(`${process.env.URL}`);
});


6. 설정값 사용하기

 

Express안에서 특정한 전역값 설정이 필요하다면 set() 과 get() 함수를 사용합니다.

const express = require('express');

const app = express();
app.set('port', 80);

app.get('', function(req, res) {
    res.send('<h1>cliel</h2>');
});

app.post('/data', function(req, res) {
    //
});

app.listen(app.get('port'), function() {
    console.log('서버 실행중...');
});

set()을 통해서는 값을 설정할 이름과 실제 값을 부여하고 get()에서 이름을 지정해 해당 값을 가져오는 방법으로 처리합니다.

 

참고로 예제에서는 port번호를 set()과 get()으로 처리하였는데 node.js의 port번호는

set PORT = [번호]

명령어를 통해 설정할 수 있으며 코드상에서는 아래와 같은 방법으로 가져올 수 있습니다.

const app = express();
app.set('port', process.env.PORT);

그러나 이 방법은 모든 서비스의 포트번호를 설정하는 것이므로 80번호를 사용하지 않는 다른 서비스에 장애를 유발할 수 있습니다.


7. 라우트

 

(1) 라우트 분리하기

 

경우에 따라서는 특정한 요청이나 URL주소에 따라 다른 파일로 라우트를 분리하기도 합니다. 너무 많은 라우트와 해당 라우트에 대한 처리 코드가 하나의 파일에 몰려 있으면 관리하기가 쉽지 않기 때문입니다.

 

우선 라우트를 분리하기 위해 다음과 같이 특정 주소에 해당하는 라우트 파일을 새롭게 생성하고

const express = require('express');

const router = express.Router();

router.get('/', (req, res) => {
	res.send('ccc');
});

module.exports = router;

default라는 디렉토리를 만들어 해당 디렉토리안에 index.js이름으로 저장합니다. 위 파일은 '/' 주소로 get 요청이 오는 경우에 해당 요청을 받아 처리하는 파일입니다.  파일을 만들고 나면 프로젝트의 메인js파일(예제에서는 app.js)에 다음과 같이 라우트를 분리하기 위한 설정을 추가합니다.

const indexRouter = require('./default');
app.use('/', indexRouter);

이 설정은 사용자가 루트경로(/)로 get요청을 하는 경우 default 디렉토리에 있는 index.js에서 아래 라우트가 요청을 처리할 수 있도록 합니다.

router.get('/', (req, res) => {
	res.send('ccc');
});

이번에는 test 디렉토리를 만들어 아래내용으로 aaa.js 라는 이름의 파일을 만들어 봅니다.

const express = require('express');

const router = express.Router();

router.get('/', (req, res) => {
	res.send('test');
});

module.exports = router;

다시 app.js로 돌아와 조금전과 같은 방법으로 route를 심어주면

const indexRouter = require('./default');
const aaaRouter = require('./test/aaa');
app.use('/', indexRouter);
app.use('/test', aaaRouter);

/test요청을 aaa.js에서 받아 처리할 수 있게 됩니다. default로 할때는 별다른 이름을 지정해 주지 않았지만 test에서는 aaa를 추가했는데 이는 default에서 index라는 기본이름을 사용한것과 달리 aaa.js처럼 임의의 이름이라면 '/aaa'와 같은 방법으로 파일이름을 지정해 줘야 합니다. index와 같은 이름은 기본파일명에 해당하기에 생략이 가능합니다.

 

그리고 app.use에서도 '/test'라는 주소를 사용했는데 이때 지정한 주소와 aaa.js파일에 사용했던 / 주소가 합해져 '/user/' 주소가 만들어 지게 되고 해당 주소로의 요청을 aaa.js에서 처리할 수 있게 됩니다.

 

만약 아래와 같이 주소는 같은데 요청방식만 다르다면

app.get('/test', function(req, res) {
    res.send(`get`);
});
app.port('/test', function(req, res) {
    res.send(`get`);
});

라우트 체인을 통해 하나로 묶어주는 것도 가능합니다.

app.get('/test', function(req, res) {
    res.send(`get`);
},
function(req, res) {
    res.send(`get`);
});

(2) 라우트 매개변수

 

라우트 매개변수를 사용하면 주소에서 특정값을 추출할 수 있습니다.

app.get('/test/:id', function(req, res, next) {
    res.send(`${req.params.id}`);
});

위와 같이 '/:[변수이름]' 형태로 라우트에 지정하고 나면 req.param.id 로 값을 받을 수 있고

 

주소에 '/id=aaa&name=kim' 처럼 get으로 키와 값이 전송되는 경우 req.query로 값을 받아올 수 있습니다.

app.get('/test/:id', function(req, res, next) {
    res.send(`${req.query.id}`);
});


8. request, response 객체

 

(1) request

 

예제에서는 간단히 req라고 줄여쓴 객체가 바로 request객체입니다. request객체는 사용자의 요청에 관한 것으로 아래와 같은 다양한 정보를 포함하고 있습니다.

request.app app 객체에 접근해 request.app.set() 함수를 통해 값을 설정하거나 request.app.set()으로 설정값을 가져올 수 있습니다.
request.body body-parser를 사용해 POST전송되는 데이터를 받을 수 있습니다.
request.cookies cookie-parser를 사용해 쿠키정보를 받을 수 있습니다.
request.ip 요청 IP를 나타냅니다.
request.params 라우트 매개변수에 대한 정보를 확인할 수 있습니다.
request.query GET으로 전송되는 쿼리스티링값을 가져올 수 있습니다.
request.signedCoolies 쿠키가 암호화 되어 있으면 해당 속성으로 값을 가져와야 합니다.
request.get(header) 지정한 헤더에 해당하는 값을 가져옵니다.

(2) response

 

예제에서 간단히 res로 줄여쓴 객체가 바로 response객체입니다. response는 응답에 관한 것으로 아래와 같은 메서드 등이 있습니다.

response.app app 객체에 접근해 request.app.set() 함수를 통해 값을 설정하거나 request.app.set()으로 설정값을 가져올 수 있습니다.
response.cookie() 쿠키를 설정합니다.
response.clearCookie() 쿠키를 삭제합니다.
response.end() 빈응답을 보냅니다.
response.json() json형식의 응답을 보냅니다.
response.redirect() 지정한 주소로 리다이렉트 합니다.
response.render() 템플릿을 렌더링합니다.
response.send() 지정한 데이터를 보냅니다.
response.sendFile() 지정한 파일을 응답합니다.
response.set() 응답의 헤더를 설정합니다.
response.status() 지정한 응답코드를 설정합니다.

 

728x90

'Server > node.js' 카테고리의 다른 글

[node.js] JWT 인증  (0) 2021.03.09
[node.js] mariaDB CRUD (시퀄라이즈)  (0) 2021.03.08
[node.js] Express  (0) 2021.03.05
[node.js] 패키지 관리  (0) 2021.03.04
[node.js] http  (0) 2021.03.04
[node.js] 에러 핸들링  (0) 2021.03.03

관련글 더보기

댓글 영역