Nose JS Express 会话为每个 http 请求接收新会话

Nose JS express session receives new session for every http request

提问人:Himanshu Agrawal 提问时间:8/14/2023 更新时间:8/14/2023 访问量:27

问:

这个问题已经被问过很多次了,但没有一个解决方案适合我。在 node.js 中,我使用的是 express-session 和 connect-mongodb-session。我的客户端是使用 React.js 开发的。服务器和客户端都运行在本地主机上,但分别在不同的端口(8080 和 3000)上运行。以下是我的服务器代码:

import cors from "cors";
import session from "express-session";
const MongoDBStore = require("connect-mongodb-session")(session);

const corsOptions   = {
    origin      : true,
    credentials : true,
    methods     : ["GET", "POST", "PUT", "DELETE"]
};

const sessionStore = new MongoDBStore(
    {
        uri        : process.env.MONGO_CON,
        collection : "sessionStore"
    }, (error : any) => {
        if(error){
            console.info("MONGO SESSION ERROR");
            console.info(error.message);
        }
        console.info("SESSION STORE INITIALIZED");
    });

sessionStore.on("error", (error : any) => {
    if(error){
        console.info("ON SESSION STORE ERROR");
        console.info(error.message);
    }
    console.info("SESSION STORE IS ON");
});

const sessionProps : session.SessionOptions = {
    secret            : "secretKey",
    resave            : true,
    saveUninitialized : true,
    store             : sessionStore,
    cookie            : {
        secure   : false,
        httpOnly : false,
        sameSite : "none",
        domain   : "http://localhost:8080/",
        maxAge   : 1000 * 60 * 60 * 24 * 7 // 1 day * 1 Week
    }
};

app.use(cors(corsOptions));
app.use(session(sessionProps));

在我的 React 客户端中,我使用以下模块发送 AJAX 请求:

export const lats_ajax = (props : TypeAjax) => {
    const params : any = props.params;
    for(let key in params){
        if(!params.hasOwnProperty(key)) continue;
        const value = params[key];
        params[key] = (typeof value === "object" || Array.isArray(value))
                      ? JSON.stringify(value)
                      : value;
    }
    
    // Encode Keys & Data as URI String
    const encodedParams = Object.keys(params)
                                .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`)
                                .join("&");
    
    // Create & Initialize New HTTP Request
    const httpRequest = new XMLHttpRequest();
    httpRequest.open(props.method || "post", props.url, true);
    httpRequest.withCredentials = true;
    httpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    
    // If Next is Available, Call Next When Request is finished & Response is ready
    httpRequest.onreadystatechange = function(this : XMLHttpRequest){
        if(this.readyState === 4 && props.next)
            props.next({status : this.status, statusText : this.statusText, response : this.response}, props.carry);
    };
    
    // Send HTTP Request with Encoded Params
    httpRequest.send(encodedParams);
};

在Firefox上一切正常,但在Edge和Chrome上,对于每个Ajax请求,服务器都会收到一个新的会话ID。这个问题似乎只在 React 或其他端口版本上出现,因为当我开发一个普通的 js 客户端并与服务器在同一端口上运行时,根本不会发生新的会话 ID 问题。我检查了所有浏览器的设置,发现没有发现任何可以纠正该问题的方法,但仍然无法理解为什么该问题仅发生在 Edge 和 Chrome 浏览器上,而不是 Firefox。谢谢!

JavaScript 节点.js reactjs ajax express-session

评论


答: 暂无答案