GraphQL 没有响应对 express-session 和 redis 的请求

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

我正在尝试为一个虚拟的 reddit 克隆创建一个后端服务器。每当我请求导致读取或写入 redis 和会话的突变时,我都会得到无限的加载时间并且服务器从不响应。我正在使用

postgresql
作为我的数据库和
mikro-orm
。我正在尝试使用
express-session
.

将redis作为会话存储集成到快速服务器

我为

graphQL
创建了 2 个模式,一个用于帖子,一个用于用户。在用户模式中,我有一个
login
解析器,它将用户 ID 保存到请求中作为
session.userId
.

index.ts:

import "reflect-metadata"
import { MikroORM } from "@mikro-orm/core"
import mikroConfig from "./mikro-orm.config"
import express from "express"
import { ApolloServer } from "apollo-server-express"
import { buildSchema } from "type-graphql"
import { HelloResolver } from "./resolvers/hello"
import { PostResolve } from "./resolvers/post"
import { UserResolver } from "./resolvers/user"
import * as redis from "redis"
import session from "express-session"
import connectRedis from "connect-redis"
import { __prod__ } from "./constants"
import { MyContext } from "./types"
// import { ApolloServerPluginLandingPageGraphQLPlayground } from "apollo-server-core"

const main = async () => {
    const orm = await MikroORM.init(mikroConfig)
    orm.getMigrator().up()

    const app = express()

    const RedisStore = connectRedis(session)
    const redisClient = redis.createClient({
        socket: {
            host: "127.0.0.1",
            port: 6379,
        },
    })

    await redisClient.connect()

    app.use(
        session({
            name: "qid",
            store: new RedisStore({
                client: redisClient,
                disableTouch: true,
            }),
            cookie: {
                maxAge: 1000 * 60 * 60 * 24 * 365 * 10, // 10 years
                httpOnly: true,
                sameSite: "none", // csrf
                secure: true, // cookie only works in https
            },
            saveUninitialized: false,
            secret: "keyboard cat",
            resave: false,
        })
    )

    const apolloServer = new ApolloServer({
        schema: await buildSchema({
            resolvers: [HelloResolver, PostResolve, UserResolver],
            validate: false,
        }),
        context: ({ req, res }): MyContext => ({ em: orm.em, req, res }),
    })
    await apolloServer.start()
    apolloServer.applyMiddleware({
        app,
        cors: {
            origin: "https://studio.apollographql.com",
            credentials: true,
        },
    })
    app.listen(4002, () => {
        console.log("Example app listening on port 4002!")
    })
}
main().catch((err) => console.error(err))

我的登录解析器如下:

@Mutation(() => UserResponse)
async login(
    @Arg("username") username: string,
    @Arg("password") password: string,
    @Ctx() { em, req }: MyContext
): Promise<UserResponse> {
    const user = await em.findOne(User, { username })
    if (!user) {
        return {
            errors: [{ field: "username", message: "that username doesn't exist" }],
        }
    }
    const valid = await argon2.verify(user.password, password)
    if (!valid) {
        return {
            errors: [{ field: "password", message: "incorrect password" }],
        }
    }
    req.session.userId = user.id

    return { user }
}

依赖项:

{
    "@mikro-orm/cli": "^5.1.2",
    "@mikro-orm/core": "^5.1.2",
    "@mikro-orm/migrations": "^5.1.2",
    "@mikro-orm/postgresql": "^5.1.2",
    "apollo-server-core": "^3.6.7",
    "apollo-server-express": "^3.6.7",
    "argon2": "^0.28.5",
    "connect-redis": "^6.1.3",
    "cors": "^2.8.5",
    "express": "^4.17.3",
    "express-session": "^1.17.2",
    "graphql": "^15.3.0",
    "pg": "^8.7.3",
    "redis": "^4.0.6",
    "reflect-metadata": "^0.1.13",
    "type-graphql": "^1.1.1"
}

我有一个在 WSL2 上运行的 Redis 服务器,我能够看到 set 和 get 请求的日志,但是响应没有到达前端。

源代码可以在这里找到.

我正在关注 Ben Awad 的this 教程。

我无法理解这是 redis、express 还是 graphQL 的问题。

Infinite Loading on Apollo Studio

我曾尝试将我的整个设置转移到 ubuntu,认为这可能是由于连接到 redis-server 而导致的错误,但我也能够在那里重现此错误。

我试过使用阿波罗游乐场,同样的事情也发生在那里。

更新:

根据docs,如果我们使用

redis@4
,我们需要在调用
legacyMode: true
时传递
createClient()
。 这是修复服务器没有响应的问题。

谢谢@robertklep

node.js express redis graphql apollo-server
© www.soinside.com 2019 - 2024. All rights reserved.