使用 graphql 和 apollo-server 在解析器中获取会话
Getting session in resolvers using graphql and apollo-server
我是 graphql 的新手,我试图用会话文件制作一个身份验证系统。
这是我的代码:
const { ApolloServer, gql } = require('apollo-server-express')
const { buildFederatedSchema } = require("@apollo/federation")
const app = require('express')()
const session = require('express-session')
const FileStore = require('session-file-store')(session)
const typeDefs = gql`
type Query {
testFunc: String
}
`
const resolvers = {
Query: {
testFunc: (_, args, context) => {
console.log(context)
const { session } = context
console.log(session)
session.something = "hello"
return session.something
}
}
}
app.use(session({
store: new FileStore({}),
secret: 'secret'
}))
const server = new ApolloServer({
schema: buildFederatedSchema([{
typeDefs,
resolvers,
context: ({ req }) => ({ session: req.session })
}])
})
server.applyMiddleware({app})
app.listen({ port: 4014 }, () =>
console.log(` Server ready at http://localhost:4014${server.graphqlPath}`)
)
这里的问题是我无法在 testFunc Resolver 中获取会话。
console.log(上下文)显示:
{ _extensionStack:
GraphQLExtensionStack {
extensions:
[ [EngineFederatedTracingExtension], [CacheControlExtension] ] } }
console.log(会话)显示 "undefined"
并且在 graphql 界面中,当我调用 testFunc 时,我显然有 "Cannot set property 'something' of undefined"。
我没有从 apollo-server v1 迁移到 v2,因为我直接从 v2 开始。
我尝试在 graphql 设置中将 "request.credentials" 设置为 "input",如 post: 中所述,但它也没有改变任何内容。
好的,我明白了,我只需要替换这个:
const server = new ApolloServer({
schema: buildFederatedSchema([{
typeDefs,
resolvers,
context: ({ req }) => ({ session: req.session })
}])
})
通过这个:
const server = new ApolloServer({
schema: buildFederatedSchema([{
typeDefs,
resolvers
}]),
context: ({ req }) => ({ session: req.session })
})
我是 graphql 的新手,我试图用会话文件制作一个身份验证系统。 这是我的代码:
const { ApolloServer, gql } = require('apollo-server-express')
const { buildFederatedSchema } = require("@apollo/federation")
const app = require('express')()
const session = require('express-session')
const FileStore = require('session-file-store')(session)
const typeDefs = gql`
type Query {
testFunc: String
}
`
const resolvers = {
Query: {
testFunc: (_, args, context) => {
console.log(context)
const { session } = context
console.log(session)
session.something = "hello"
return session.something
}
}
}
app.use(session({
store: new FileStore({}),
secret: 'secret'
}))
const server = new ApolloServer({
schema: buildFederatedSchema([{
typeDefs,
resolvers,
context: ({ req }) => ({ session: req.session })
}])
})
server.applyMiddleware({app})
app.listen({ port: 4014 }, () =>
console.log(` Server ready at http://localhost:4014${server.graphqlPath}`)
)
这里的问题是我无法在 testFunc Resolver 中获取会话。
console.log(上下文)显示:
{ _extensionStack:
GraphQLExtensionStack {
extensions:
[ [EngineFederatedTracingExtension], [CacheControlExtension] ] } }
console.log(会话)显示 "undefined"
并且在 graphql 界面中,当我调用 testFunc 时,我显然有 "Cannot set property 'something' of undefined"。
我没有从 apollo-server v1 迁移到 v2,因为我直接从 v2 开始。
我尝试在 graphql 设置中将 "request.credentials" 设置为 "input",如 post:
好的,我明白了,我只需要替换这个:
const server = new ApolloServer({
schema: buildFederatedSchema([{
typeDefs,
resolvers,
context: ({ req }) => ({ session: req.session })
}])
})
通过这个:
const server = new ApolloServer({
schema: buildFederatedSchema([{
typeDefs,
resolvers
}]),
context: ({ req }) => ({ session: req.session })
})