iT邦幫忙

2

[NodeJS] 第一次 NodeJS 就上手 Part 3

有一就有二,無三不成禮,所以我們這次來講 Session 的東西,順便介紹一點點資料庫。
Session? Database?

RTFM

Session in NodeJS

其實 NodeJS 並沒有特別實做 Session 這個項目,所以第三方套件就有相當多的選擇,

  1. Express
  2. connect
  3. connect-redis
  4. cookie-sessions
  5. DO IT BY YOURSELF

上述的 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, 如果真的那麼想做,那這裡有一篇文章可以參考一下,

node.js and Session Handling

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, 下回待續。


尚未有邦友留言

立即登入留言