express.urlencoded
이 미들웨어 함수는 HTTP POST 요청의 본문(body)에 인코딩된 데이터를 해석하고, req.body 객체에 채워넣어주는 역할을 합니다.
간략하게 사용되는 예시를 보여 드리면 다음과 같습니다.
const express = require('express');
const app = express();
app.use(express.urlencoded({ extended: false })); //false : querystring 모듈 사용
app.post('/login', (req, res) => {
console.log(req.body.username); // POST 요청의 body에 포함된 username 값을 출력
console.log(req.body.password); // POST 요청의 body에 포함된 password 값을 출력
res.send('로그인이 완료되었습니다.');
});
app.listen(3000);
이러한 express.urlencoded() 함수는 Content-Type 헤더가 application/x-www-form-urlencoded로 설정된 요청에 대해 사용되는대. 이 헤더는 대개 HTML 폼(form)에서 데이터를 전송할 때 사용됩니다.
그리고 express.urlencoded() 함수는 내부적으로 Node.js의 querystring 모듈 이나 외부의 qs 모듈을 사용하여 본문 데이터를 해석합니다.
참고로) 익스프레스 4.16.0 버전부터 body-parser 미들웨어의 일부 기능이 익스프레스에 내장되면서 과거 'body-parser' 라이브러리를 설치해야만 사용 가능했던 urleccoded 메서드를 express 의 내장 메서드로서 사용할 수 있게 되었습니다.
또한, express.urlencoded 는 기본적으로 다음과 같은 형태를 지닙니다.
app.use(express.urlencoded({ extended: false }));
// or
app.use(express.urlencoded({ extended: true }));
이제부터, 이 글을 작성한 목적인 두가지 속성값이 무엇을 의미하는지, 같은 기능을 하는 것은 분명한데, 무엇을 사용하는게 좋은지 등을 알아보고자 합니다.
.
express.urlencoded({ extended : true })
extended 속성의 값으로 true를 입력하게 되면 qs 모듈을 사용하여 쿼리스트링을 해석합니다. qs 모듈은 node.js 내장 모듈이 아니므로 외부에서 다운 받아야 하는데 npm 을 통해 설치합니다.
qs 모듈은 URL 쿼리 문자열을 자바스크립트 객체 형태로 변환하거나, 객체를 URL 쿼리 문자열로 변환하는 기능을 하며, querystring 모듈과는 다르게 배열이나 객체를 다루는 데 있어서 보다 복잡한 구조를 지닌 객체나 배열의 경우에도 변환이 가능합니다.
다음 코드에서 알 수 있듯이, qs 모듈은 자바스크립트 객체나 배열과 같은 복잡한 형태의 타입을 URL 쿼리 문자열로 변환하기에 적합함을 알 수 있습니다.
const qs = require('qs');
// JavaScript 객체를 URL 쿼리 문자열로 변환
const obj = {
name: 'John',
age: 25,
hobbies: ['reading', 'swimming'],
address: {
city: 'Seoul',
street: 'Gangnam'
}
};
const params = qs.stringify(obj);
console.log(params); // name=John&age=25&hobbies%5B0%5D=reading&hobbies%5B1%5D=swimming&address%5Bcity%5D=Seoul&address%5Bstreet%5D=Gangnam
express.urlencoded({ extended : false })
false 를 입력하면 querystring 모듈을 사용하여 쿼리스트링을 해석합니다. querystring 은 node.js 의 내장 모듈입니다. 이 모듈 URL-querystring 으로 표현 가능한 객체 형태의 단순한 문자열을 다루는 데 적합합니다.
이해를 돕기 위해 다음 코드를 준비해 보았습니다. 객체를 URL 쿼리 문자열로 바꾸는 것과 URL 쿼리 문자열을 객체로 변환하는 예시를 표현했습니다.
//querystring 모듈을 불러옵니다.
const querystring = require('querystring');
//URL-querystring 형식으로 데이터를 저장합니다.
const params = 'name=John&age=25';
//querystring 모듈의 parse 메서드를 사용하여 문자열을 객체로 변환합니다.
const obj = querystring.parse(params);
// 변환된 객체를 출력합니다.
console.log(obj); // { name: 'John', age: '25' }
const querystring = require('querystring');
// 단순한 객체 리터럴을 저장합니다.
const obj = { name: 'John', age: '25' };
// querystring 모듈의 stringify 메서드를 사용하여 객체를 url-쿼리문자열로 변환합니다.
const params = querystring.stringify(obj);
// 변환된 결과를 출력합니다.
console.log(params); // name=John&age=25
위 코드에서 알 수 있듯이 querystring 모듈은 URL 쿼리 문자열과 단순한 자바스크립트 객체 형태의 문자열 간의 변환을 수행하는 데 적합한 모듈입니다.
따라서 그 외 배열 자료형이나 URL 쿼리문자열로 사용하기 어려운 문자나 기호를 사용하는 경우에는 아에 변환이 불가능하거나 부정확하게 변환이 될 수 있습니다.
즉, 복잡한 배열이나 객체의 형태를 가지는 경우에는 qs 모듈을 사용하는 것이 적합하고, URL 쿼리 문자열로 표현하기 쉬운 단순한 객체 문자열 형태라면 querystring 모듈을 사용하는 것이 좋습니다.
'백엔드 > 노드' 카테고리의 다른 글
[node.js] morgan "HTTP 요청과 응답에 관련한 정보를 기록하는 미들웨어" (0) | 2023.03.16 |
---|---|
[node.js] node.js 에서 express서버를 구축할 때 포트 지정 시 process.env.PORT 를 사용하는 이유 (0) | 2023.03.15 |
[node.js] static 파일과 static 미들웨어 (0) | 2023.03.14 |
[node.js] MVC 패턴 (0) | 2023.03.14 |
[node.js] 패키지의 버전과 기호 (0) | 2023.03.12 |