throw new TypeError('无效的参数类型');从{mypath}\Deskt\red



我正在学习ben的typescript GraphQLRedis教程我是typescript的新手,当我添加属性req.session.userId=user.id时,我第一次尝试redis

TypeError:参数类型无效在encodeCommand(C:\Users\vikash-patel\Desktop\reddit\node_modules@redis\client\dist\lib\client\RESP2\encoder.js:17:19

我的主要.ts代码

declare module "express-session" {
interface SessionData {
userId: number | undefined;
}
}
import connectRedis from "connect-redis";
import { MyContext } from "./types";
const main = async () => {
const orm = await MikroORM.init(microConfig);
await orm.getMigrator().up();
const app = express(); 
const RedisStore = connectRedis(session);
const redisClient = redis.createClient() as any;
await redisClient.connect();
console.log("redis connected",redisClient.isOpen);
app.use(
  session({
    name: "qid",
    store: new RedisStore({
      client: redisClient,
      disableTouch: true,
      // disableTTL: true,
    }),
    cookie: {
      maxAge: 1000 * 60 * 60 * 24 * 365, //1year
      httpOnly: true,
      sameSite: "lax", //protecting csrf
      // secure:__prod__  //cookie only works in https
    },
    secret: "hellovikash",
    resave: false,
    saveUninitialized: false,
  })
);
const apolloserver = new ApolloServer({
  schema: await buildSchema({
    resolvers: [HelloResolver, PostResolver, UserResolver],
    validate: false,
}),
context: ({ req, res }): MyContext => ({ em: orm.em, req, res }),
});
await apolloserver.start();
apolloserver.applyMiddleware({ app });
// app.get("/",(_,res)=>{
//   res.send("ehllo")
// })
app.listen(4000, () => console.log("server is running on port 4000"));

我的用户.ts

@Mutation(() => USerResponse)
  async login(@Arg('options', () => UsernamePasswordInput) options: 
UsernamePasswordInput,
      @Ctx() { em, req }: MyContext
  ): Promise<USerResponse> {
    const user = await em.findOne(User, { username: options.username.toLowerCase() })
    if (!user) {
        return {
            errors: [{
                field: "username",
                message: "could not find username"
            }]
        }
    }
    const valid = await argon2.verify(user.password, options.password);
    if (!valid) {
        return {
            errors: [{
                field: "username",
                message: "password is incorrect"
            }]
        }
    }
      req.session.userId= user.id;   //This is the line which is creating error
      return {
        user
      };
  }

我的类型.ts

import { EntityManager, IDatabaseDriver, Connection } from "@mikro-orm/core"
import { Request, Response } from "express"
export type MyContext = {
  em: EntityManager<any> & EntityManager<IDatabaseDriver<Connection>>
  // req: Request;
  req: Request & { session: Express.SessionStore };
  res: Response;
}

我真的很笨。。。请帮忙:(

您需要创建启用legacyMode的Redis客户端:

const redisClient = createClient({ legacyMode: true });

如果您使用的是最新的redis v4,这是connect-redis软件包的限制(https://github.com/tj/connect-redis)。

如果您将在2023年使用redis@4.6.5,这可能会很累,尤其是当您需要向后兼容性时。

就我而言,我以前使用redis@3.1.1.这里有一个快速解决方案。

import { createClient } from "redis";
const redis_url: string = REDIS_URL;
const a = URL.parse(redis_url);
const redisClient: any = createClient({
 url: a.href,
 legacyMode: true // Add this to createClient
});

最新更新