有一就有二,無三不成禮,所以我們這次來講 Session 的東西,順便介紹一點點資料庫。
Session? Database?
RTFM
Session in NodeJS
其實 NodeJS 並沒有特別實做 Session 這個項目,所以第三方套件就有相當多的選擇,
上述的 Express 與 connect 其實是講同一件事情,Express 本身是使用 Connect (Connect Middleware Framework) 所提供的方法,所以以下我會以 Connect 來稱呼他們。雖然我很不想講,不過關於 Connect 所提供的 Session 可以去看官方的介紹。
然而,connect-redis 其實也是 Connect 的一個延伸,由於 Connect 所儲存 Session 的方式,是把他儲存在記憶體中(MemoryStore),這是預設的。而這個第三方套件,是可以將 Session 儲存在 Redis 這個資料庫中。關於 Redis 我們往後再做介紹,當然也有 connect-mongo 可以用就是了。
最後,你也可以用前陣子很流行的 Cookie base 的儲存方式,來放你的 Session。cookie-sessions 就是一個第三方套件,用於將 Session 放在 Cookie 裡面,不過,他需要用到 Connect,而有趣的地方是,Connect 本身也提供了 Cookie session middleware,所以要怎麼用就見仁見智。
DO IT BY YOURSELF, 如果真的那麼想做,那這裡有一篇文章可以參考一下,
Session in Connect
既然人家都把輪子準備好了,那麼我們直接拿來滾也是很合理的。
(function() {
var app, express;
express = require('express');
app = express.createServer();
app.configure(function() {
return this.use(express.session({
secret: "@#$TYHBVGHJIY^TWEYKJHNBGFDWGHJKUYTWE#$%^&*&^%$#"
}));
});
app.listen(3000, function() {
return console.info("Express server listening on port " + (this.address().port) + " in " + process.env.NODE_ENV + " mode");
});
}).call(this);
然後我們執行了一下,服務正常啟動了,但是瀏覽器連線的時候,馬上出了錯誤!
$ node test.js
Express server listening on port 3000 in development mode
TypeError: Cannot read property 'connect.sid' of undefined
at Object.session [as handle] (/home/hinablue/node-in-session/node_modules/express/node_modules/connect/lib/middleware/session.js:299:32)
at next (/home/hinablue/node-in-session/node_modules/express/node_modules/connect/lib/http.js:203:15)
at Object.handle (/home/hinablue/node-in-session/node_modules/express/lib/http.js:83:5)
at next (/home/hinablue/node-in-session/node_modules/express/node_modules/connect/lib/http.js:203:15)
at HTTPServer.handle (/home/hinablue/node-in-session/node_modules/express/node_modules/connect/lib/http.js:216:3)
at HTTPServer.emit (events.js:70:17)
at HTTPParser.onIncoming (http.js:1514:12)
at HTTPParser.onHeadersComplete (http.js:102:31)
at Socket.ondata (http.js:1410:22)
at TCP.onread (net.js:374:27)
少了什麼東西嗎?是的,依照 Express 官方說明,我們還需要 cookieParser() 這個東西,所以我們把他加上去,
(function() {
var app, express;
express = requi/home/hinablue/workspace/works/jsdc/re('express');
app = express.createServer();
app.configure(function() {
this.use(express.cookieParser());
return this.use(express.session({
secret: "@#$TYHBVGHJIY^TWEYKJHNBGFDWGHJKUYTWE#$%^&*&^%$#"
}));
});
app.listen(3000, function() {
return console.info("Express server listening on port " + (this.address().port) + " in " + process.env.NODE_ENV + " mode");
});
}).call(this);
然後我們再試一次,就正常運作了呢,接下來我們做一個 / 來讓瀏覽器可以顯示一點東西,
(function() {
var app, express;
express = require('express');
app = express.createServer();
app.configure(function() {
this.use(express.cookieParser());
return this.use(express.session({
secret: "@#$TYHBVGHJIY^TWEYKJHNBGFDWGHJKUYTWE#$%^&*&^%$#"
}));
});
app.get("/", function(req, res) {
console.info(req.session.item);
req.session.item = 'Hello World';
return res.send('Hello World');
});
app.listen(3000, function() {
return console.info("Express server listening on port " + (this.address().port) + " in " + process.env.NODE_ENV + " mode");
});
}).call(this);
然後我們執行之後,打開瀏覽器拜訪一下 Hello World,
$ node test.js
Express server listening on port 3000 in development mode
undefined
Hello World
你會發現,我們第一次訪問的時候,session.item 是空值(undefined),而第二次訪問的時候,session.item 已經變為 Hello World 了。這樣是一個簡易的 Session 在 Express 當中的操作。如果你需要更多操作的方法,可以查看官方的文件說明。
Session in MongoDB, 下回待續。