无法拥有持久的会话ID——NodeJS、Express、React

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

React 的一个前端,当我到达登陆页面时,有一个 START 按钮,该按钮仅在单击并到达

/start
端点时触发一次。 来自前端的后续请求将转到
/upload-audio
端点。 会话 ID 不会随着来自前端的后续请求而改变。 在本地主机上运行时一切似乎都工作正常(没有 Redis 内存存储)

当我引入 Redis 并部署前端(在 Vercel 上)和后端(在 Render 上)时,会话 ID 在同一会话的后续请求之间发生变化。基本上,/start 端点将会话 ID 发送到服务器,该会话 ID 在后续对 /upload-audio 的请求后会发生变化。我使用 Redis 作为内存存储来保持会话 ID 持久。

(在云上部署时,我确实从本地主机更改了 CORS 和端点)

调试了两天,但找不到有效的解决方案。

请帮忙!!

const express = require('express');
const multer = require('multer');
const FormData = require('form-data');
const cors = require('cors');
const session = require('express-session');
require('dotenv').config();
const session = require('express-session');
const RedisStore = require('connect-redis').default;

const { createClient: createRedisClient } = require('redis');

const redisClient = createRedisClient({
  password: process.env.REDIS_PASSWORD,
  socket: {
    host: process.env.REDIS_HOST,
    port: process.env.REDIS_PORT,
  },
});

try {
  redisClient.connect();
  console.log('Redis client connected successfully');
} catch (error) {
  console.error('Error connecting to Redis:', error);
}

// Initialize store.
const redisSessionStore = new RedisStore({
  client: redisClient,
  prefix: 'session:',
});

const app = express();
app.use(express.json());
app.use(cors({ origin: 'http://localhost:3000', credentials: true }));

app.use(
  session({
    secret: 'suresh',
    resave: false,
    saveUninitialized: true,
    rolling: true,
    store: redisSessionStore,
    cookie: { secure: true, maxAge: 600000, sameSite: 'none', httpOnly: false },
  })
);

const PORT = process.env.PORT || 3001;
const storage = multer.memoryStorage();
const upload = multer({ storage: storage });

app.post('/start-ai', async (req, res) => {
  const sessionId = req.sessionID;
  console.log('Session ID is: %s', sessionId);

  // Run Functions and store as const firstMessage 

    return res.status(200).send(firstMessage);
  } catch (error) {
    console.error('Error:', error);
    return res.status(500).send('Internal Server Error');
  }
});

app.post('/upload-audio', upload.single('audio'), async (req, res) => {
  const sessionId = req.sessionID;
  console.log('Session ID for audio: %s', sessionId);

  //* Get audio file in API request
  try {
    const audioFile = req.file;
    if (!audioFile) {
      return res.status(400).send('No audio file uploaded.');
    }

    // Run transcription on Audio file and other functions

    return res.status(200).send({ lastMessage, chatStatus: true });

  } catch (error) {
    console.error('Error getting response:', error);
    return res.status(500).send('Error processing audio');
  }
});
node.js session redis cors express-session
1个回答
0
投票

您可以尝试将会话数据保存在创建会话的位置。 Session.save() 方法用于保存请求之间的会话数据。例如:

app.post("/createSession", async (req, res) => {
       const username = req.body.username;
       const password = req.body.password;
       const user = {username: username, password: password);
       req.session.user = user.
      
       req.session.save((err) => {
           if (!err) {
              res.json({session_data: req.session.user});
          }
           else {
              console.error("Error: " + err);
         }
    });
});
© www.soinside.com 2019 - 2024. All rights reserved.