graphql-server node版(一)
1、使用的相关技术:
graph-yoga:建立在express ,apollo-server,graphql-js上的一个Graphql 服务器。
prisma:可以将数据库转变成Graph API,可以通过API对创建的数据模型实施增删改查的功能。
graphql-config和graphql-cli:改善GraphQL相关工作流程的工具。
graphql-bindings:一种方便的方式去使用GraphAPI,可以将你对api的所有操作转变为javascript函数。
GraphQL-playground:GraphQL IDE”,允许通过向其发送query和mutaition来交互式地探索GraphQL API的功能.
客户端请求=》graph-yoga接受请求=》通过graph-bindings向数据库请求数据=》数据库使用prisma生成了graph API接口,=》prisma将根据请求操作数据库并将数据返回。
2、创建过程
(1)创建一个保存GraphQL服务器文件的目录
mkdir hackernews-node cd hackernews-node yarn init -y
这样在hackernews-node文件夹下将有一个package.json文件,每当我们在hanckernes-node文件夹下安装包时,会自动记录在package.json文件中。它是构建node应用程序的配置文件。
(2)创建一个的graphql server
为服务器创建入口文件,新建一个src文件夹并创建index.js文件
mkdir src touch src/index.js
添加依赖项,我们使用graphql-yoga来创建graphql server
yarn add graphql-yoga
graphql-yoga所具有的功能:
- GraphQL规范兼容
- 支持文件上传
- GraphQL订阅的实时功能
- 适用于TypeScript类型
- 对GraphQL Playground的开箱即用支持
- 通过Express中间件可扩展
- 解决GraphQL架构中的自定义指令
- 查询性能跟踪
- 接受两者
application/json和application/graphql内容类型 - 到处运行:可通过以下方式部署
now,up,AWS Lambda和Heroku等。
在index.js中输入下面的代码:
const { GraphQLServer } = require('graphql-yoga')
// 1
const typeDefs = `
type Query {
info: String!
}
`
// 2
const resolvers = {
Query: {
info: () => `This is the API of a Hackernews Clone`
}
}
// 3
const server = new GraphQLServer({
typeDefs,
resolvers,
})
server.start(() => console.log(`Server is running on http://localhost:4000`))
主要内容是创建一个服务器server,并且启动server.start()
使用grapql-yoga的GraphQLServer来创建服务器,GraphQL服务器一般需要指定schema和对应的解析函数。因此GraphQL至少接受两个参数,一个是typeDefs代表定义的schema,另一个是resolvers代表typeDefs对应的解析函数。
这里的typeDefs,我们定义了一个根类,Query,还有两个根类分别是Mutation和Subscription.在Query类下我们定义了一个info字段,info是一个根字段(GraphQL API的查询,突变或订阅时,这些始终需要以root字段开头),type是String!,是一个scalar类型。
然后对应Query下的info定义一个解析函数,这里的resolvers中的结构和名称与typeDefs一致。
(3)使用GraphQL playground启动并测试GraphQL服务器
node src/index.js
如终端输出所示,服务器现在正在运行http://localhost:4000。要测试服务器的API,请打开浏览器并导航到该URL。您将看到的是GraphQL Playground,一个功能强大的“GraphQL IDE”,可让您以交互方式探索API的功能。通过单击右侧的绿色SCHEMA按钮,您可以打开API文档。此文档是根据您的架构定义自动生成的,并显示架构的所有API操作和数据类型。
在GrqphQL playground中输入一个请求:
query {
info
}
点击播放按钮,将会看到我们使用解析函数返回的info对应的信息。
4、关于Graphql schema
Graphql API的核心其实就是一个schema。schema使用SDL语言写的。SDL有一个强类型系统来定义schema的结构。每个schema有三个根类:Query, Mutation 和Subscription分别代表查询,修改和订阅。在根类中的字段是根字段,代表了所有可以进行的GraphQL api的操作。
看下下面的例子
type Query {
users: [User!]!
user(id: ID!): User
}
type Mutation {
createUser(name: String!): User!
}
type User {
id: ID!
name: String!
}
定义了两个根类Query和Mutation,共有三个根字段users,user,createUser代表了我们可以进行的所有操作。定义的type User仅仅是为了在根类的根字段中引用。
schema一般对定义在一个单独的文件下:src/schema.graphql,然后引入作为typeDefs.
创建GraphQL server我们需要以schema为基础,在此基础上定义对应的resolvers.
有时候我们需要在解析函数中共享结果,这时我们就用到了context,context可以被所有的resolvers读和写。
定义GraphQL server一般为:
new GraphQLServer({typeDefs:'src/schema.graphql',resolvers,context})
针对上面的schema我们在客户端可以执行的操作:
# Query for all users
query {
users {
id
name
}
}
# Query a single user by their id
query {
user(id: "user-1") {
id
name
}
}
# Create a new user
mutation {
createUser(name: "Bob") {
id
name
}
}
注意:在我们请求ObjectType的时候必须至少指定一个字段,即必须到末级查询。根字段可以是任何类型,但末级字段必须是scala类型。
当我们定义好GraphQL server之后(即指导了schema,resolver和context),prisma便可以对照schema,resovler,context将上面的请求转变为数据库可以读取的SQL语句向数据库请求服务,并返回结果。
浙公网安备 33010602011771号