express app 使用 Connect-redis 存储会话数据时出现错误“Type Error Client.get is not a function”

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

我对使用快递还很陌生。我正在使用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 不是我应该用来存储会话的最佳快速查询数据库。

一些额外的细节:

  • 我安装了redis,使用命令“npm i redis”和“npm i connect-redis”连接redis
  • 我将发布我的路由器命令、终端中出现的错误、我的注销功能、index.js、redis 设置和会话设置
  • 注销时的错误不会被注销函数中的 err if 语句捕获。该错误被我的全局错误捕获函数捕获

会话实施

/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('/');
}


终端错误

Stackerror

StackError Number#2

我尝试过的事情:

我尝试过的所有这些事情都没有改变我的程序的行为。

express redis node-redis connect-redis
© www.soinside.com 2019 - 2024. All rights reserved.