웹 프로그래밍

url 모듈, querystring 모듈

토픽 웹 프로그래밍 > node.js

url 모듈

http://nodejs.org/api/url.html

url 모듈은 url 정보를 객체로 가져와 분석하거나(parse) url 객체를 문자열로 바꿔주는 기능(format, resolve)을 수행합니다.

url.parse(urlStr, [parseQueryString], [slashesDenoteHost])

url 문자열(urlStr)을 url 객체로 변환하여 리턴합니다. parseQueryString과 slashesDenoteHost는 기본값으로 false입니다.

parseQueryString

  • true : url 객체의 query 속성을 객체 형식으로 가져옵니다.(querystring 모듈을 사용합니다.)
  • false : url 객체의 query 속성을 문자열 형식으로 가져옵니다.

slashesDenoteHost

  • true : urlStr이 '//foo/bar' 인 경우 foo는 host, /bar는 path로 인식합니다.
  • false : urlStr이 '//foo/bar' 인 경우 //foo/bar 전체를 path로 인식하고 host는 null 입니다.

예제

// urlExmaple.js

var url = require('url');
var parsedObject = url.parse('http://user:pass@host.com:8080/p/a/t/h?query=string#hash');

console.log(parsedObject); // url 객체 정보 출력
console.log(url.format(parsedObject)); // url 객체를 문자열로 출력

실행 결과

$ node urlExample.js
{ protocol: 'http:',
  slashes: true,
  auth: 'user:pass',
  host: 'host.com:8080',
  port: '8080',
  hostname: 'host.com',
  hash: '#hash',
  search: '?query=string',
  query: 'query=string',
  pathname: '/p/a/t/h',
  path: '/p/a/t/h?query=string',
  href: 'http://user:pass@host.com:8080/p/a/t/h?query=string#hash' }
http://user:pass@host.com:8080/p/a/t/h?query=string#hash

url.format은 따로 언급하진 않았지만 실행 결과에서 보듯이 문자열로 출력해 줍니다.

 

querystring 모듈

 http://nodejs.org/api/querystring.html

querystring 모듈은 url 객체의 query와 관련된 모듈입니다. 분명 유용한 모듈이긴 하지만 url 모듈의 두 번째 인자 값을 조정함으로써 해결할 수도 있습니다.

매개 변수 [sep], [eq]

매개 변수를 먼저 살펴 보겠습니다. sep는 separator로 기본값은 '&' 입니다. 쿼리가 여러 개가 있을 때 쿼리와 쿼리 간의 구분자 역할을 합니다. eq는 assignment 역할을 하는 기호로 기본값은 '=' 입니다.

일반적인 쿼리 문자열은 다음과 같습니다. (아래는 네이버에 querystring을 검색했을 때 쿼리로 붙은 결과값입니다.)

where=nexearch&query=querystring&sm=top_hty&fbm=1&ie=utf8

parse(str, [sep], [eq], [options]), stringify(obj, [sep], [eq]) 

querystring.parse() 는 쿼리 문자열을 쿼리 객체로 바꿔주는 역할을, querystring.stringify() 는 쿼리 객체를 쿼리 문자열로 바꿔주는 역할을 합니다. 둘 다 sep과 eq 옵션을 통해 구분자와 대입자를 임의로 정할 수 있습니다.

querystring.parse() 의 options는 객체 형식이며 maxKeys 속성을 통해 최대 개수를 제한할 수 있습니다. 기본값은 1000이며 0으로 설정할 경우 그 제한을 없앨 수 있습니다.(하지만 잘 사용하지는 않습니다.)

예제

// querystringExample.js

var querystring = require('querystring');

var qStr = 'where=nexearch&query=querystring&sm=top_hty&fbm=1&ie=utf8';
var qObj = querystring.parse(qStr); // 일반적인 사용
var qObj2 = querystring.parse(qStr, '&', '=', { maxKeys: 3 });
// 구분 문자열이 다를 경우 &와 = 자리에 해당 문자를 넣어 사용합니다.
// maxKeys로 3을 넘겨주면 값을 3개만 가져옵니다.

console.log(qObj); // 쿼리의 값들을 모두 가져옴
console.log(querystring.stringify(qObj));
console.log(querystring.stringify(qObj, '; ', '->'));

console.log(qObj2); // 쿼리의 값을 3개만 가져옴
console.log(querystring.stringify(qObj2));
console.log(querystring.stringify(qObj2, '; ', '->'));

실행 결과

$ node querystringExample.js
{ where: 'nexearch',
  query: 'querystring',
  sm: 'top_hty',
  fbm: '1',
  ie: 'utf8' }
where=nexearch&query=querystring&sm=top_hty&fbm=1&ie=utf8
where->nexearch; query->querystring; sm->top_hty; fbm->1; ie->utf8
{ where: 'nexearch', query: 'querystring', sm: 'top_hty' }
where=nexearch&query=querystring&sm=top_hty
where->nexearch; query->querystring; sm->top_hty

댓글

댓글 본문
  1. admin
    혹시 현재 넘오는 url값을 받아와서 저장하는 방법은 어떻게 하나요?
    대화보기
    • admin
      혹시 현재 넘오는 url값을 받아와서 저장하는 방법은 어떻게 하나요?
    • miki
      위 예제에서 보듯 url.parse(urlStr, [parseQueryString], [slashesDenoteHost]) 메소드를 이용하면 url과 관련된 객체를 가져옵니다. 그 객체에 query 속성도 있습니다. 하지만 문자열이죠. 그런데 두 번째 인자인 parseQueryString의 값을 true로 주면 query 속성을 문자열이 아닌 객체로 가져옵니다. 이렇듯 url 객체로도 쿼리를 객체형식으로 가져올 수 있다는 표현이었습니다...
      대화보기
      • 나무마루
        아 그렇군요.감사합니다.제가 지식이 얕아서... ㅎㅎ 궁금한게 또 있는데요.
        Querystring 부문에서

        "querystring 모듈은 url 객체의 query와 관련된 모듈입니다.
        분명 유용한 모듈이긴 하지만 url 모듈의 두 번째 인자 값을 조정함으로써 해결할 수도 있습니다."

        이렇게 표현 하셨는데, 유용한 모듈이긴 한데, 인자값을 조정함으로써 해결할수도 있다니...
        음 뭔가 말이 좀 이상하지 않나요? 아니면 제가 이해를 못한건가요? 뭔가 이상한데요.
        대화보기
        • miki
          마지막 인자로 { maxKeys: 3 }를 넘겨주었기 때문에 결과 값을 3개만 가져온 것입니다.
          사실 잘 사용하지 않는 기능이라 예제를 조금 수정했습니다.
          qObj 형태가 더 많이 사용하는 형태이고 qObj2는 참고로 봐주세요.^^
          대화보기
          • 나무마루
            마지막 예제에서 fbm=1&ie=utf8 는 그냥 기니깐 안 쓰신겁니까?