首页 > 解决方案 > 如何从自定义指令访问 Apollo 上下文

问题描述

我正在尝试集成一些自定义指令以检查我的应用程序中的访问权限

我尝试了很多方法来实现 apolloGrapql 自定义指令,但我总是遇到同样的问题,我无法从指令访问我的上下文函数

=> 我想要做什么https://www.apollographql.com/docs/apollo-server/schema/creating-directives/#declaring-schema-directives

=> 我有什么

...imports
// graphql server
async function startApolloServer () {
  class HasRole extends SchemaDirectiveVisitor {
    visitObject (type) {
      this.ensureFieldsWrapped(type)
      type._requiredAuthRole = this.args.requires
    }
    visitFieldDefinition (field, details) {
      this.ensureFieldsWrapped(details.objectType)
      field._requiredAuthRole = this.args.requires
    }
    ensureFieldsWrapped (objectType) {
      const fields = objectType.getFields()
      Object.keys(fields).forEach(fieldName => {
        field.resolve = async function (...args) {
          console.log('context please', args[2])
          // return {} 
         // can't access decodedToken()
        }
      })
    }
  }

  const app = express()
  const server = new ApolloServer({
    schema: makeExecutableSchema({
      typeDefs,
      resolvers,
      context: ({ req, res, next }) => {
        return {
          decodedToken: () => {
            return getUser(req)
          }
        }
      },
      schemaDirectives: {
        hasRole: HasRole
      }
    })
  })
  await server.start()
  server.applyMiddleware({ app })
  await new Promise(resolve => app.listen({ port: process.env.PORT }, resolve))
  console.log(` Server ready at http://localhost:${process.env.PORT}${server.graphqlPath}`)
  enableApiControllers(app)
  return { server, app }
}
startApolloServer()

标签: node.jsgraphqlapolloapollo-server

解决方案


终于找到了,

上下文不应在模式中定义,例如 =>

  const server = new ApolloServer({
    context: ({ req, res, next }) => {
      return {
        decodedToken: () => {
          return getUser(req)
        }
      }
    },
    schema: makeExecutableSchema({
      typeDefs,
      resolvers,
      schemaDirectives: {
        hasRole: HasRole
      }
    })
  })

推荐阅读