12

ログイン機能でこれを行っています

app.post('/teacherlogin', function(request, response) {
    var username = request.body.username;
    var password = request.body.password;
    con.query('SELECT t_id from login_teacher where username="'+username+'" and password="'+password+'"',function(err,results){

       if(results.length > 0) {

           request.session.regenerate(function(){
              request.session.user = username;
              request.session.type = 'teacher';
              request.session.id = results[0].t_id;
              response.redirect('/teacherhome');
          });

       } else {

          response.redirect('teacherlogin');
       }

    });

});

今、セッションオブジェクトに保存した「id」と「type」を発行したいと思います。どうすればいいですか?この記事を読みましたが、経験が浅いため、使用するのに苦労しています。コードで使用しました

var MemoryStore = express.session.MemoryStore;
var sessionStore = new MemoryStore();
app.use(express.bodyParser());
app.use(express.cookieParser('secret text'));
app.use(express.session({
    store: sessionStore,
    secret: 'secret', 
    key: 'express.sid'}
));

var Session = require('connect').middleware.session.Session;
io.set('authorization', function (data, accept) {
    if (data.headers.cookie) {
        data.cookie = require('cookie').parse(data.headers.cookie);
        data.sessionID = data.cookie['express.sid'].split('.')[0];
        console.log('data.sessionID "'+data.sessionID);
        data.sessionStore = sessionStore;
        sessionStore.get(data.sessionID, function (err, session) {
           if (err || !session) {
               accept('Error', false);
           } else {
               data.session = new Session(data, session);
               accept(null, true);
           }
        });
    } else {
      return accept('No cookie transmitted.', false);
    }
});

セッションオブジェクトに何も入っていません。sessionStore の内容をログに記録しようとしましたが、空のようです! セッションに保存している情報が sessionStore に保存されていないということですか? はいの場合、そこに保管するにはどうすればよいですか?そこに保存されている場合、sessionStore.get関数がそれを見つけられないのはなぜですか?

4

2 に答える 2

9

まだこれに取り組んでいるかどうかはわかりませんが、MemoryStore だけでセッション データにアクセスできます。結局のところ、それが機能しない場合、Express はそれをどのように使用するのでしょうか? :)

MemoryStore の動作を示す簡単な方法は次のとおりです。

var express = require("express")
  , app = express()
  , sessionStore = new express.session.MemoryStore();

// middleware
app.use(express.cookieParser());
app.use(express.session({store: sessionStore, secret: "mysecret"}));

// any endpoint sets a cookie
app.get("/", function(req,res) {
  res.send('ok');
});

// This endpoint reveals it
app.get("/session", function(req, res){
  sessionStore.get(req.sessionID, function(err, data) {
    res.send({err: err, data:data});
  });
});

app.listen(3000);

ヒット/に続いて/session次の応答が返されます。

{
  "err": null,
  "data": {
    "cookie": {
      "originalMaxAge": null,
      "expires": null,
      "httpOnly": true,
      "path": "/"
    }
  }
}

あなたの問題は、ソケットからセッション ID を取得する方法にあると思われますが、MemoryStore からセッションを抽出することは間違いなく可能です。また、Express サーバーを再起動するとすべてのセッションが破棄されるため、再起動するたびに新しい Cookie が必要になることに注意してください。

于 2014-02-10T06:01:53.850 に答える
0

データベースを使用して高速セッションを保存し、socket.io 定義内の Cookie データを解析し、取得した情報を使用してデータベースからセッション情報を取得する必要があります。完全な例を次に示します。

https://stackoverflow.com/a/13098742/218418

また、Cookie から解析されたセッション ID を使用して、ユーザーをセッション名の「チャット ルーム」に参加させることもできます。

于 2013-11-12T08:13:01.510 に答える