GraphQL 没有响应对 express"/>
GraphQL 没有响应对 express
我正在尝试为一个虚拟的 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: "",
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 的问题。
我曾尝试将我的整个设置转移到 ubuntu,认为这可能是由于连接到 redis-server 而导致的错误,但我也能够在那里重现此错误。
我试过使用阿波罗游乐场,同样的事情也发生在那里。
更新:
根据docs,如果我们使用
redis@4
,我们需要在调用legacyMode: true
时传递createClient()
。
这是修复服务器没有响应的问题。
谢谢@robertklep
回答如下:更多推荐
GraphQL 没有响应对 express
发布评论