快递会话不一致

时间:2017-08-24 06:12:57

标签: node.js reactjs sockets session express

在我的项目中,我正在使用nodejs(express),反应js和socket.io来开发聊天应用程序。但是我无法在套接字函数(io.use)中获得“正确的sessionid”。

在server.js文件中,有一些路由和函数来处理套接字连接。 在我的项目中,我在login.js文件中启动了快速会话。 成功登录后...我正在重定向到home.js,实习生返回home.html。 home.html包含js文件,它有反应代码并且还有套接字连接。

server.js

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var path = require('path');
var DIST_DIR = path.join(__dirname, "bin");
var express = require('express');

//Getting session store
var session = require('express-session');
var cookieParser = require('cookie-parser');
var sessionStore = new session.MemoryStore();
var handshakeData ={};  
var cookie = require('cookie');

//Importing routes
 var login = require('./routes/login.js'); 
 var registration = require('./routes/registration.js');
 var home = require('./routes/home.js'); 


//Getting cookies from request header. so that from it we can get sessionid. 
io.use(function(socket, next) { 

  handshakeData = socket.request;
  var cookies = cookie.parse(handshakeData.headers.cookie);

//Bringing sessionid and storing in a global variable
console.log("***********************Server*********************");
console.log("");
console.log('All cookies parsed in io.use ( %s )', JSON.stringify(cookies));
handshakeData.sessionID = cookies['connect.sid'].split('.')[0].split(':'[1];
console.log('All cookies parsed at server ( %s )', JSON.stringify(cookies));
console.log('Session id at server cookie value in io.use( %s )', 
JSON.stringify(handshakeData.sessionID));
next();
});

//Bringing session data by sending "sessionid" to sessionStore 
(MemoryStore)place 
io.on('connection', function(socket){

  sessionStore.get(handshakeData.sessionID, function (err, session) {
            handshakeData.session = session;

            //Now we can retrieve all session data. But sessionID sent was 
not correct     

    }); 

console.log('user connected');
socket.on('new message', function(msg){
console.log('Server recieved new message: '+msg);
io.emit('new message', msg);
});
socket.on('disconnect', function(){
console.log('user disconnected');
});
});

app.use('/', login);
app.use('/registration', registration); 
app.use('/home', home); 


http.listen(8080, function(){
console.log("listening on port 8080");
});

login.js

var bodyParser = require('body-parser');
var urlencodedParser = bodyParser.urlencoded({ extended: false })
var cookieParser = require('cookie-parser'); 
var session = require('express-session');
var sessionStore = new session.MemoryStore();
var login_success = 0;

router.use(cookieParser());

router.use(session({ cookie: {
    maxAge  : 24*60*60*1000
 },
  store: sessionStore,
  saveUninitialized: true,
  resave: true,
  secret: '1234567890QWERT'
  }));

router.get('/', function(req, res){

  console.log("Actual session id before login: "+ req.sessionID);   
//Clearing cookies at client side.
    res.clearCookie("login_message");
    res.clearCookie("connect.sid");
    res.clearCookie("io");
    res.clearCookie("user_name");
    res.clearCookie("user_id");


if (login_success == 2)
  {
     res.cookie('login_message', 'incorrectCredentials');
     login_success = 0;
  }

  res.sendFile(path.join(SRC_DIR,"login.html"));
 // res.sendFile(path.join(__dirname, '../bin', 'login.html'));

});





router.post('/', urlencodedParser, function(req, res){


console.log("database called");

//Fetching form data
   var username = req.body.loginusername;  
   var password  = req.body.loginpassword;


 //Connection string to datanbase
   var MongoClient = require('mongodb').MongoClient;
   var url = "mongodb://localhost:27017/WebChat";

 //Comparing username and password.
   MongoClient.connect(url, function(err, db) {
       if (err) throw err;
       var query = { email: username, password: password };
       db.collection("Profile").find(query).toArray(function(err, result) {
          if (err) throw err;
          console.log(result);
          db.close();
          if (result.length != 0)
          {
              console.log("login success");
              login_success = 1;

              //Setting session variables
              req.session.userid = username;
              req.session.username= result[0].firstname;

              console.log("***********************Login*********************");
              console.log("");

              console.log("Actual session id at login: "+ req.sessionID);
              console.log("Session userid at server set to :"+ req.session.userid);
              console.log("Session name at server set to :"+ req.session.username);

              //res.sendFile(path.join(SRC_DIR,"home.html"));
              //  res.status(200).send(req.session);

                   console.log("Session reload called");
                   res.redirect('/home');

          }
          else
          {

              //**It is for when user come to login page with entering wrong credentials
              login_success = 2;
              console.log("login failed");
              res.redirect('http://localhost:8080');

          }


        });
    });

});

//export this router to use in our server.js
module.exports = router;

home.js

var express = require('express');
var router = express.Router();
var path = require("path");
var SRC_DIR=path.join(__dirname, "../src/views");

var session = require('express-session');
 cookie = require('cookie');
var cookieParser = require('cookie-parser');
var sessionStore = new session.MemoryStore();
var handshakeData ={};

router.use(cookieParser());


router.use(session({ cookie: {
    maxAge  : 24*60*60*1000
  },
  store: sessionStore,
  saveUninitialized: true,
  resave: true,
  secret: '1234567890QWERT'
  }));  



router.get('/', function(req, res){


 //setting cookie at client side
  res.clearCookie("user_id");
  res.clearCookie("user_name");

  res.cookie('user_id', req.session.userid);
  res.cookie('user_name', req.session.username);


 // res.status(200).send(req.session);
  console.log(" session reload called");
  setTimeout(function(){
  res.sendFile(path.join(SRC_DIR,"home.html"));
  }, 5000);

  console.log("***********************Home*********************");
  console.log("");
  console.log("Actual session id at home: "+ req.sessionID);
  console.log("Cookie userid at client set to :"+ req.session.userid);
  console.log("Cookie username at client set to :"+ req.session.username);


});


//export this router to use in our server.js
module.exports = router;

home.jsx(客户端文件)

class Home extends React.Component {

constructor(props) {
super(props);
this.state = {messages: [],socket: io.connect('http://localhost:8080')};
this.send = this.send.bind(this)

  }
}
export default Home

在exicuting“node server.js”时输出:

output

在上面的输出中...
 1.登录页面我们有两个不同的会话ID(登录前和登录后)。我不知道为什么会这样  2.在访问“server.js”内的会话变量时,在“io.use”函数中...我们再次获取旧的会话ID,这是在登录之前设置的。但是我不能得到我的会话变量。因为我需要传递新的会话变量才能访问sessionStore.get中的会话变量。

请帮忙。我已经尝试了3天。 提前谢谢。

0 个答案:

没有答案