我对使用快递还很陌生。我正在使用express、react 和 mongodb 创建一个全栈应用程序。当在 Express 服务器上存储 sessionID 时,我使用带有“redis”和“connect-redis”包的 redis 存储。
在大多数情况下,这个结构是有效的,但是,当我尝试注销时会发生一个错误,导致服务器混乱。
我可以登录(创建个人资料、获取帖子等),没有任何错误,但由于某种原因,一旦我尝试注销,我会收到此 TypeError: client.get is not a function 错误。即使我尝试重新启动两台服务器,此错误消息仍然会在我的终端中弹出。此外,一旦我开始获取这些 TypeError 函数,即使我重新启动服务器,每当我登录(/执行 API 端点的任何请求)时,我现在都会收到错误消息“TypeError:client.set 不是函数”。我可以正常登录,但会弹出此消息。然后,当我尝试注销时,我收到 client.get 错误和 client.set 错误以及响应状态 500。
如果有人对解决此错误有任何见解,我将非常感激。也许,Redis 不是我应该用来存储会话的最佳快速查询数据库。
一些额外的细节:
会话实施
/myapp/middleware/session.js
import session from "express-session";
import connectRedis from "connect-redis";
import RedisStore from "connect-redis";
// Database
import redisClient from "../db/redis.js"
// Initialize store.
let redisStore = new RedisStore({
client: redisClient,
prefix: "myapp:",
})
// Connecting Session with Redis server
export default session(
{
store: redisStore,
secret: 'SOME_PASSWORD',
resave: false,
saveUninitialized: false, the session,
name: "sessionID",
cookie: {
secure: false,
httpOnly: true,
maxAge: 1000 * 60 * 30 ,
}
}
);
/myapp/db/redis.js
Redis 实现
import {createClient} from 'redis';
import session from "express-session";
// Error
import ApiError from "../error/ApiError.js"
// Configuration of Redis Instance
// Initialize client.
let redisClient = createClient();
try{
console.log("Creating client")
redisClient.connect()
} catch(err){
console.error("Redis error: ", err)
throw ApiError.redisError("Error with Redis")
}
export default { redisClient }
/myapp/index.js
Index.js 实现
import express from 'express';
import cors from "cors";
import authServer from "./routes/authServer.js";
import session from "./middleware/session.js";
import redisClient from "./db/redis.js"
appAuthServer.use(express.json());
appAuthServer.use(session);
appAuthServer.use(cors())
appAuthServer.use('/users', authServer)
appAuthServer.get('*', (req, res) => {
res.send("Route not found", 404)
})
appAuthServer.listen(AUTH_SERVER_PORT, ()=>{
console.log(`Auth Server is running on port: ${AUTH_SERVER_PORT}`)
})
appAuthServer.use(apiErrorHandler)
export default {
appAuthServer
};
子路由器实现 /myapp/routers/posts.js
const router = express.Router();
// Allows express to use json
router.use(express.json());
router.post('/createProfile', authController.createProfile);
router.post('/login', authenticateLogin, authController.login)
router.use(authenticateSession)
router.post('/logout', authController.logout)
router.delete("/deleteAccount", authController.deleteAccount);
注销功能实现
function logout(req, res, next){
console.log("In the log out function")
req.session.destroy(req.sessionID, (err) => {
if (err) {
next(ApiError.internal("Error in logging out"))
}
console.log("Destroyed session")
})
return res.redirect('/');
}
终端错误
我尝试过的事情:
我尝试过的所有这些事情都没有改变我的程序的行为。