使用 graphql 和 apollo-server 在解析器中获取会话
Posted
技术标签:
【中文标题】使用 graphql 和 apollo-server 在解析器中获取会话【英文标题】:Getting session in resolvers using graphql and apollo-server 【发布时间】:2020-03-27 04:41:24 【问题描述】:我是 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(context) 显示:
_extensionStack:
GraphQLExtensionStack
extensions:
[ [EngineFederatedTracingExtension], [CacheControlExtension] ]
console.log(session) 显示“未定义”
在 graphql 界面中,当我调用 testFunc 时,我显然有“无法设置未定义的属性‘某事’”。
我没有从 apollo-server v1 迁移到 v2,因为我是直接从 v2 开始的。 我尝试在 graphql 设置中将“request.credentials”设置为“input”,如本文所述:Apollo 2.0.0 Graphql cookie session 但它也没有改变任何东西。
【问题讨论】:
【参考方案1】:好的,我想通了,我只需要替换这个:
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 和 apollo-server 在解析器中获取会话的主要内容,如果未能解决你的问题,请参考以下文章
来自 GraphQL 网站的 Apollo-server 教程产生错误
外部 WebSocket 服务器上的 Apollo-Server GraphQL 订阅
如何修复错误:使用 graphql 在 apollo-server 中多次定义类型“Extra”
我们如何从 apollo-server 模块传递 ApolloServer 中的数据源和合并的 graphql 模式和解析器?