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

问题描述 投票:0回答:1

这个问题已被问过多次,但没有一个解决方案适合我。在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 node.js reactjs ajax express-session
1个回答
0
投票

你好@Himanshu Agrawal,
你找到这个问题的答案了吗?我有类似的问题(无法在这里添加评论)

费边

© www.soinside.com 2019 - 2024. All rights reserved.