如何在 GraphQL 解析器中设置(数据库或其他)上下文?

met*_*mza 5 node.js graphql

GraphQL 文档给出了一个解析器函数的例子,它接受一个名为“context”的参数。

他们不得不这样说——

context 提供给每个解析器并保存重要上下文信息的值,例如当前登录的用户或对数据库的访问。

他们的代码示例如下所示 -

Query: {
  human(obj, args, context) {
    return context.db.loadHumanByID(args.id).then(
      userData => new Human(userData)
    )
  }
}
Run Code Online (Sandbox Code Playgroud)

在我看来,这是一种非常自然的模式,希望在解析器函数中访问数据库,不出所料,这正是我需要做的。

显然,这个数据库上下文不是自动设置的,因为 GraphQL 完全不知道您的特定数据持久性方式。

我的问题是,如何配置此上下文以提供特定的数据库接口?我在教程/文档中或任何地方都找不到提到这一点。

yac*_*aka 6

您可以在调用函数时将上下文传递给 graphql graphql此处
指定。

以下是该函数的流程定义graphql

graphql(
  schema: GraphQLSchema,
  requestString: string,
  rootValue?: ?any,
  contextValue?: ?any, // Arbitrary context
  variableValues?: ?{[key: string]: any},
  operationName?: ?string
): Promise<GraphQLResult>
Run Code Online (Sandbox Code Playgroud)


oti*_*ssv 5

上下文是在您设置服务器时定义的。我也无法在文档中看到它。

graphqlExpress(req => {
  return {
    schema: makeExecutableSchema({
      typeDefs: schema.ast,
      resolvers,
      logger
    }),
    context: {
      db: mongodb.MongoClient.connect(...)
    }
  };
})
Run Code Online (Sandbox Code Playgroud)