본문 바로가기

node.js (OctoberSkyJs)

[node.js] Connect 2.0 소개

우리의 미치광이 개발자 TJ Holowaychuk가 Connect 2.0 을 공개하였습니다. Express의 근간이 되는 모듈이죠. 곧 Express 3.0이 나올예정인데요, Express 사용자라면 한번쯤 봐두면 도움이 될 겁니다. : )



Connect 2.0

새로운 코어 미들웨어와 여러가지 개선사항, 그리고 새로운 문서들(docs)과 함께 하는 Connect 2.0입니다.

var app = connect()
  .use(connect.logger('dev'))
  .use(connect.static('public'))
  .use(function(req, res){
    res.end('hello world\n');
  })

 app.listen(3000);

HTTP and HTTPS

기존  connect.Server는 노드의 코어인  net.Server를 상속했는데요, HTTP와 HTTPS를 모두 제공하기가 어려웠습니다. 이전에는 connect.createServer()였습니다만 이제 새로운 connect() 는 간단한 자바스크립트 함수입니다. 따라서 이젠 아래와 같은 식으로  app.listen()호출을 생략하고  app을 노드의 net.Server로 간단히 넘길 수 있습니다. 

var connect = require('connect')
  , http = require('http')
  , https = require('https');

var app = connect()
  .use(connect.logger('dev'))
  .use(connect.static('public'))
  .use(function(req, res){
    res.end('hello world\n');
  })

http.createServer(app).listen(80);
https.createServer(tlsOptions, app).listen(443);

Body parsers

 bodyParser() 미들웨어는 이제 단순히  json()multipart(), 그리고 urlencoded() 를 추가하는데 쓰는 축약표현에 불과합니다. 해당 함수들은 파싱된 값들을  req.body 에 담습니다. 그리고 multipart()는 업로드를 위해 req.body와 req.files를 제공합니다.

==  bodyParser 소스코드 ==
exports = module.exports = function bodyParser(options){ var _urlencoded = urlencoded(options) , _multipart = multipart(options) , _json = json(options); return function bodyParser(req, res, next) { _json(req, res, function(err){ if (err) return next(err); _urlencoded(req, res, function(err){ if (err) return next(err); _multipart(req, res, next); }); }); } };  
 

Core compression

Node 0.6.0에서 빠른 네이티브 압축능력들을 제공하는 관계로, 이제 우리도 gzip과 deflate를 지원하는  compress()  미들웨어를 갖게 되었습니다.

Cookie parser 

cookieParser() 미들웨어는 이제 싸인된 쿠키들(signed cookies)과 secret을 받아들입니다. 해당 기능은 session({ secret: string })을 session()미들웨어로 넘길 필요성을 교체하였습니다. 싸인된 쿠키들은 req.signedCookies를 통해서, 그리고 싸인되지 않은 쿠키들은 req.cookies를 통해 사용가능합니다.
 

Error delegation

이전의 몇몇 코어 미들웨어는 에러 상황들에 직접 응답해야 했었습니다.. 해당 사항들은 단순히  next(err) 를 함게 쓰는 걸로 변경되었습니다. 이렇게 변경함으로써 에러 핸들링 미들웨어를 추가함으로써 커스터마이즈된 행동들을 지정하는 것이 가능해졌습니다.

app.use(function(err, req, res, next){
  if (4 == err.status / 100) {
    // render a client-error page
  } else {
    // render a server-error page
  }
});

Session

앞서 언급했던 것처럼 session()은 더이상 secret을 필요로 하지 않습니다. .maxAge 쿠키는 null이 기본값이었는데요, 브라우저 세션쿠키가 된다는 뜻이고요, 방문자가 브라우저를 닫으면 만료됩니다.

Third-party middleware

서드파티 미들웨어는 완벽하게 동작 합니다만 이번 Connect 릴리즈는  Express 2.x 와 호환되지 않습니다. 곧   Express 3.0 이 나올예정입니다.

Changelog

공개된 API에 영향을 주지않는 것들을 포함해서 다음과 같은 중요한 변경이 이루어졌습니다. 마찬가지로 Mocha를 사용해서 테스트를 다시 다 작성했습니다.

  • 쿠기만으로 동작하는 세션을 위한  cookieSession() 미들웨어 추가
  • gzip/deflate 지원을 위한 compress() 미들웨어 추가middleware for gzip / deflate support
  • X-Forwarded-Proto 인증을 위한  session() “proxy” 세팅 추가 
  • "application/json" 파싱용 json() 미들웨어 추가 
  • "application/x-www-form-urlencoded" 파싱을 위한  urlencoded() 미들웨어 추가
  • "multipart/form-data" 파싱을 위한 multipart() 미들웨어 추가
  • cookieParser(secret) 지원. 이 미들웨어를 통하면 싸인된 쿠기에 접근할 수 있음
  • cookieParser()가 싸인된 쿠키를 지원함
  • cookieParser()가 직렬화된 JSON 쿠키를 지원함
  • Connect의 기본 엔드포인트(default end-point)에서  err.status를 지원함
  • staticCache()에 X-Cache MISS / HIT가 추가됨
  • 퍼블릭 res.headerSent에 res._headerSent 노드를 먼저 체크하는 것이 추가됨
  • basicAuth()는 req.remoteUser에서 req.user로 변경됨
  • Changed: session() 기본값이 브라우저 세션 쿠키로 변경됨
  • Changed: 소문자 쿠키이름을 더이상 지원하지 않음
  • Changed: bodyParser()가   json()urlencoded()multipart()를 이용함 
  • Changed: errorHandler()는 이제부터는 개발시 모드 전용 미들웨어가 됨
  • Changed: 미들웨어에서 에러가 발생할 수 있으면  next()를 이용해서 애플리케이션이 로깅과 핸들링을 단일화 할 수 있음
  • http[s].Server 의 상속관계를 제거함. 이제부터는 그냥 함수니까 http, https 둘 다 제공하는 앱을 만드는게 더 쉬어짐
  • Removed: .createServer() 제거됨 (connect() 사용하삼)
  • Removed: session()에서 secret 옵션을 제거함  cookieParser(secret) 사용하삼 
  • Removed: connect.session.ignore 배열지원 제거
  • Removed: router() 미들웨어 제거
  • Fixed: set-cookie only once for browser-session cookies
  • Fixed FQDN support 수정됨. 앞에 “/” 붙이지 마세요
  • Fixed 404 XSS attack vector. Closes #473
  • Fixed HEAD 가  Connect 의 엔드포인트에 의해 생성된 404s 와 500s 를 지원하도록 변경됨