使用 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 模式和解析器?

graphql apollo-server 中的文件上传错误

在 apollo-server 中将网关上的联合类型转换为服务 GraphQL 中的标量类型