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/jsonapplication/graphql内容类型
  • 到处运行:可通过以下方式部署nowup,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有三个根类:QueryMutation 和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语句向数据库请求服务,并返回结果。

 

posted @ 2018-09-09 14:34  tutu_python  阅读(301)  评论(0)    收藏  举报