zombie45
zombie's dev story
zombie45

공지사항

  • 분류 전체보기
    • iPhone
    • Study

인기 글

최근 댓글

최근 글

티스토리

반응형

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록
  • 글쓰기
전체 방문자
오늘
어제

태그

  • 안드로이드
  • Box2d cocos2dx cocos2d-x
  • Animtaion
  • caching
  • Nodejs node express expressjs
  • 카카오 로그인
  • nextFocus
  • flutter_localizations
  • jks
  • 큰파일
  • cocoapods-binary-cache
  • Flutter
  • CI/CD
  • flutter l10n helper
  • 오블완
  • textformfield
  • UIViewController
  • 자동배포
  • code spell checker
  • TextInputAction
  • android_key_hash
  • appDelegate
  • 티스토리챌린지
  • intl
  • l10nization
  • 큰폴더
  • FocusScope
  • cspell
  • cache
  • actions
hELLO · Designed By 정상우.
zombie45

zombie's dev story

Study

NodeJS Express 3.0 에서 Express 4.0 으로

2014. 5. 29. 05:51

Express 4.0 갈아타기

Express 4.0 이 나오면서 Connect가 빠졌기때문에 다소 많은 부분의 변경이 필요합니다.

Connect 는 Node 를 위한 HTTP 프렝미워크입니다

http://scotch.io/bar-talk/expressjs-4-0-new-features-and-upgrading-from-3-0

위 사이트에서 자세한 내용을 보실 수 있습니다 단 영문입니다

제 경험을 위주로 설명해보겠습니다

connect 관련입니다

app.use(express.favicon());                // favicon -> static-favicon 따로 설치
app.use(express.logger('dev'));            // 삭제하셔야됩니다
app.use(express.json());                // 삭제하셔야됩니다
app.use(express.urlencoded());            // 삭제하셔야됩니다
app.use(express.methodOverride());        // 삭제하셔야됩니다
app.use(express.cookieParser('secret'));// 삭제하셔야됩니다
app.use(express.session());                // 삭제하셔야됩니다

다음과 같이 바꾸시면 됩니다

var express = require('express'),
    morgan = require('morgan'),
    bodyParser = require('body-parser')
    methodOverride = require('method-override')
    app = express();

app.use(express.static(__dirname + '/public'));    // static 파일 위치입니다
app.use(morgan('dev'));        // request 로깅입니다
app.use(bodyParser());        // html POST 관련 파서입니다
app.use(methodOverride());    // DELETE, PUT을 실행해줍니다(안쓰시는분들은 안하셔도 됩니다)

app.listen(8080);
console.log('Starting server on port 8080');

app.configure 이 사라졌습니다

app.configure('development', function() {
   // 기존에 dev 모드일때 이렇게 사용했습니다
});

다음과 같이 변경되었습니다

var env = process.env.NODE_ENV || 'development';
if ('development' == env) {
   // dev 모드의 코드가 들어가게 됩니다
}

app.router() 이 변경되었습니다

app.use(app.router); // 이제 삭제하셔야 됩니다.

다음과 같이 사용하시면 됩니다

app.get('/login', function(req, res, next) {
});
app.post('/login', function(req, res, next) {
});
// 혹은 다음과 같이 사용하셔도 됩니다
app.route('/login')
    .get(function(req, res, next){})
    .post(function(req, res, next){});
// 혹은 다음과 같이 사용합니다.
var router = express.Router();
router.get('/', function(req, res, next){});
router.post('/', function(req, res, next){});
app.use('/login', router);

locals 에 관하여

기존 방식입니다

app.post('/login', function(req, res) {
    app.locals({user : admin});
    res.render('login');
});

다음과 같이 바뀌었습니다

app.post('/login', function(req, res) {
    app.locals = {user : 'admin'};   // 혹은
    app.locals.user = 'admin'
    res.render('login');
});

cookieParser 에 관하여

전 socket.io와 같이 사용하는대 로그인을 cookieParser+session 으로 이용합니다

다음과 같이 사용합니다

var EXPRESS_SID_KEY = 'express.sid';
var session = require('express-session');
var cookieParser = require('cookie-parser')('secret string');
var sessionStore = new session.MemoryStore();

app.use(cookieParser);
app.use(session({
    store: sessionStore,
    cookie: {
        httpOnly: true
    },
    key: EXPRESS_SID_KEY
}));
// POST 로 user 을 줬을시에 req.body.user 을 session에 받습니다
app.post('/login', function(req, res) {
    req.session.user = req.body.user;
    res.render('login', {title:'LOGIN'});
});



// 아래는 socket.io 에 handshake 핸들러를 통해 세션정보를 가져옵니다
// 기존에 쓰던 방식과 같습니다.
io.set('authorization', function (data, callback) {
    if(!data.headers.cookie) {
        return callback('No cookie transmitted.', false);
    }
    // We use the Express cookieParser created before to parse the cookie
    // Express cookieParser(req, res, next) is used initialy to parse data in "req.headers.cookie".
    // Here our cookies are stored in "data.headers.cookie", so we just pass "data" to the first argument of function
    cookieParser(data, {}, function(parseErr) {
        if(parseErr) { return callback('Error parsing cookies.', false); }

        // Get the SID cookie
        var sidCookie = (data.secureCookies && data.secureCookies[EXPRESS_SID_KEY]) ||
                        (data.signedCookies && data.signedCookies[EXPRESS_SID_KEY]) ||
                        (data.cookies && data.cookies[EXPRESS_SID_KEY]);

        // Then we just need to load the session from the Express Session Store
        sessionStore.load(sidCookie, function(err, session) {
            // And last, we check if the used has a valid session and if he is logged in
            if (err || !session || session.user == null) {
                callback('Not logged in.', false);
            } else {
                // If you want, you can attach the session to the handshake data, so you can use it again later
                // You can access it later with "socket.handshake.session"
                data.session = session;
                callback(null, true);
            }
        });
    });
});

io.sockets.on('connection', function(socket) {
    console.log('A socket with session ' + socket.handshake.session.user + ' connected!');    //socket.handshake.session안에 session 정보를 가져올수있습니다
})


반응형

'Study' 카테고리의 다른 글

한틀아리 3주  (0) 2014.07.20
express.js post pending problem  (0) 2014.07.08
한틀 스터디 (4/13)  (0) 2014.04.16
intellij ftp 연결  (0) 2014.03.30
cannot find module "jade"  (0) 2014.03.29
    'Study' 카테고리의 다른 글
    • 한틀아리 3주
    • express.js post pending problem
    • 한틀 스터디 (4/13)
    • intellij ftp 연결
    zombie45
    zombie45
    잡다한 개발

    티스토리툴바