javascript - kasta nytt TypeError('Ogiltig argumenttyp'); från {mypath}\Desktopeddit\node_modules\@redis\client\dist\lib\client\RESP2\encoder.js:17 t
Jag följer Bens TypeScript GraphQL Redis-handledning. Jag är ny på TypeScript och testade redis för första gången när jag lade till egenskapen req.session.userId=user.id;
TypeError: Ogiltig argumenttyp vid encodeCommand (C:\Users\vikash patel\Desktop\reddit\node_modules@redis\client\dist\lib\client\RESP2\encoder.js:17:19
min main.ts-kod
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"));
min user.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
};
}
mina typer.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;
}
Jag är verkligen dum... snälla hjälp :)
Svar #1
Du behöver skapa Redis-klienten med legacyMode aktiverat:
const redisClient = createClient({ legacyMode: true });
Det är en begränsning av connect-redis-paketet om du använder den senaste redis v4 (https://github.com/tj/connect-redis).
Svar #2
Om du kommer hit 2023 med [email kan det vara tröttsamt, särskilt om du behöver bakåtkompatibilitet.
I mitt fall använde jag tidigare [email . Här är en snabb lösning.
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
});
