Study

NodeJS Express 3.0 에서 Express 4.0 으로

zombie45 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 정보를 가져올수있습니다
})


반응형