【问题标题】:How access Apollo context from custom directive如何从自定义指令访问 Apollo 上下文
【发布时间】:2021-10-15 03:26:26
【问题描述】:

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

我尝试了很多方法来实现 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.js graphql apollo apollo-server


    【解决方案1】:

    终于找到了,

    不应在架构中定义上下文 例如 =>

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-01
      • 2016-02-21
      • 2021-11-27
      • 2021-06-12
      • 2021-06-18
      • 1970-01-01
      相关资源
      最近更新 更多