GraphQL LogoGraphQL

构建类型

对于许多应用程序,您可以在应用程序启动时定义一个固定模式,并使用 GraphQL 模式语言来定义它。在某些情况下,以编程方式构建模式很有用。您可以使用 GraphQLSchema 构造函数来完成此操作。

当您使用 GraphQLSchema 构造函数创建模式时,您不是仅使用模式语言来定义 QueryMutation 类型,而是将它们创建为单独的对象类型。

例如,假设我们正在构建一个简单的 API,它允许您根据 ID 获取几个硬编码用户的用户数据。使用 buildSchema,我们可以编写一个带有以下内容的服务器:

var express = require("express")
var { createHandler } = require("graphql-http/lib/use/express")
var { buildSchema } = require("graphql")
var schema = buildSchema(`
type User {
id: String
name: String
}
type Query {
user(id: String): User
}
`)
// Maps id to User object
var fakeDatabase = {
a: {
id: "a",
name: "alice",
},
b: {
id: "b",
name: "bob",
},
}
var root = {
user: ({ id }) => {
return fakeDatabase[id]
},
}
var app = express()
app.all(
"/graphql",
createHandler({
schema: schema,
rootValue: root,
})
)
app.listen(4000)
console.log("Running a GraphQL API server at localhost:4000/graphql")

我们可以实现相同的 API,而无需使用 GraphQL 模式语言

var express = require("express")
var { createHandler } = require("graphql-http/lib/use/express")
var graphql = require("graphql")
// Maps id to User object
var fakeDatabase = {
a: {
id: "a",
name: "alice",
},
b: {
id: "b",
name: "bob",
},
}
// Define the User type
var userType = new graphql.GraphQLObjectType({
name: "User",
fields: {
id: { type: graphql.GraphQLString },
name: { type: graphql.GraphQLString },
},
})
// Define the Query type
var queryType = new graphql.GraphQLObjectType({
name: "Query",
fields: {
user: {
type: userType,
// `args` describes the arguments that the `user` query accepts
args: {
id: { type: graphql.GraphQLString },
},
resolve: (_, { id }) => {
return fakeDatabase[id]
},
},
},
})
var schema = new graphql.GraphQLSchema({ query: queryType })
var app = express()
app.all(
"/graphql",
createHandler({
schema: schema,
})
)
app.listen(4000)
console.log("Running a GraphQL API server at localhost:4000/graphql")

当我们使用这种方法创建 API 时,根级解析器是在 QueryMutation 类型上实现的,而不是在 root 对象上实现的。

如果您想从其他内容(如数据库模式)自动创建 GraphQL 模式,这将特别有用。您可能有一个用于创建和更新数据库记录的通用格式。这对于实现诸如联合类型之类的功能也很有用,这些功能无法干净地映射到 ES6 类和模式语言。

继续阅读 →graphql-http