簡體   English   中英

Express-session req.session in Websocket Socket.io?

[英]Express-session req.session in Websocket Socket.io?

我嘗試在 express 和 socket.io 之間交換會話 -

當我連接到 Websocket 時,我可以在 session 中設置 userData 並在另一個 Websocket 事件中再次獲取它!

服務器.ts

const session =  require("express-session");
const sessionData = {
    name: COOKIE_NAME,
    secret:COOKIE_SECRET,
    resave: false,
    saveUninitialized: false,
    store: store
}
const expressSession = expressSession(sessionData);

const socketSession = require("express-socket.io-session");
const sharedsession = socketSession(expressSession, {
    autoSave:true
})

 const io = new Server(httpsServer,{
            cors: {
              origin: "https://localhost:3000",
              methods: ["GET", "POST"]
            }
          })
  io.use(sharedsession);
        io.on("connection", (socket: Socket) => {
            socket.on("message",userdata=>{
                var data = socket.handshake || socket.request;
                (data as any).session.userdata = userdata;
                (data as any).session.save();
                console.log("From Session:",(data as any).session.userdata)
            })
            socket.on("getUser",()=>{
                var data = socket.handshake || socket.request;
                console.log("Got it: ",(data as any).session.userdata)// good!
            })
});

但是現在......當我在這樣的快速路線中設置 session 時:

app.get('/login', function (req, res) {
    req.session.user =  {_id: '', firstname:'Hide', lastname:'myPain',email:'Harold@hiden.com', hasPain: false, };
    res.send('You are now logged in! => isLoggedIn:' + JSON.stringify(req.session.user));
});

現在我想在我的 Websocket 事件中訪問這個 req.session.user:

    socket.on("getUser",()=>{
        var data = socket.handshake || socket.request;
        console.log("Got it: ",(data as any).session.user)  // undefined!
    })

我在 req.session.user 的快速路由中設置的 session.user 未定義.. 為什么? 它是要像這樣工作,還是只是為了在 Websocket 事件之間交換?

或者我只需要觸發

            (data as any).session.user= newUserDataFromExpressReq;
            (data as any).session.save();

當用戶調用我的快速端點進行登錄時在我的 socketio 上? 所以它不是真正的自動交換?

好的,所需要的只是向客戶端添加“withCredentials”選項。 當您的客戶端和服務器在不同的服務器/端口上運行時,這是必需的。

// client-side
const io = require("socket.io-client");
const socket = io("https://api.example.com", {
  withCredentials: true,
  extraHeaders: {
    "my-custom-header": "abcd"
  }
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM