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');
}
});
您可以尝试将会话数据保存在创建会话的位置。 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);
}
});
});