graphql-server node版(二)

使用GraphQL服务器我们要做的所有工作就是定义shcema并对应其解析函数。

(1)增加typeDefs

(2)扩展对应的resolvers

1、查询

(1)扩展schema定义:

const typeDefs = `
type Query {
  info: String!
  feed: [Link!]!
}

type Link {
  id: ID!
  description: String!
  url: String!
}
`

  增加一个feed根字段,返回一个link列表,列表是非空的,列表中的对象也是非空的。Link包含三个字段:id,description和url,三个字段都是非空的。

(2)解析typeDefs中的每个字段

// 1
let links = [{
  id: 'link-0',
  url: 'www.howtographql.com',
  description: 'Fullstack tutorial for GraphQL'
}]

const resolvers = {
  Query: {
    info: () => `This is the API of a Hackernews Clone`,
    // 2
    feed: () => links,
  },
  // 3
  Link: {
    id: (root) => root.id,
    description: (root) => root.description,
    url: (root) => root.url,
  }
}

  feed对应的解析函数:返回一个links。由于这里还没有使用数据库,因此我们这里暂时使用一个变量links代替,links只存在于运行期的内存中,当刷新页面时links就找不到了。

  对于Link中的每个字段,我们都使用了root。这里就涉及到了解析器的参数,解析器都有四个参数root,args,context(ctx),info.

  root:代表上一级对象。GrqphQL解析过程时一层一层解析的,一层就是一个大括号,先解析最外面的大括号,外面大括号解析的结果会作为root传递给括号内的字段,这里解析出的Link,会作为root传递到id,description,url的解析函数中。

  args:代表了请求的参数。由于feed中没有定义参数,因此feed中没有定义args.

  ctx:代表了我们在服务器定义的context,为所有的resolver共享,可以读取和写入。

  info:代表了请求的所欲字段信息。如请求为query{feed{id}},那么info就代表了请求Link中的id字段的信息。

由于Link是采用统一的模式解析,对于这样的解析我们可以不必明确声明,服务器可以自动帮我们解析。

2、mutaition

(1)扩展schema定义:

在index.js中

const typeDefs = `
type Query {
  info: String!
  feed: [Link!]!
}

type Mutation {
  post(url: String!, description: String!): Link!
}

type Link {
  id: ID!
  description: String!
  url: String!
}
`

  由于schema会变得越来越大,我们可以单独定义一个文件来存放他

在src下新建schema.graphql文件,并将上面的类型定义复制到该文件下

type Query {
  info: String!
  feed: [Link!]!
}

type Mutation {
  post(url: String!, description: String!): Link!
}

type Link {
  id: ID!
  description: String!
  url: String!
}

  这样可以删除在index.js中的typeDefs变量。然后在服务器定义中按照路径声明typeDefs:

const server = new GraphQLServer({
  typeDefs: './src/schema.graphql',
  resolvers,
})

  (2)解析typeDefs中的每个字段

let links = [{
  id: 'link-0',
  url: 'www.howtographql.com',
  description: 'Fullstack tutorial for GraphQL'
}]
// 1
let idCount = links.length
const resolvers = {
  Query: {
    info: () => `This is the API of a Hackernews Clone`,
    feed: () => links,
  },
  Mutation: {
    // 2
    post: (root, args) => {
       const link = {
        id: `link-${idCount++}`,
        description: args.description,
        url: args.url,
      }
      links.push(link)
      return link
    }
  },
}

  这里新增了post对应的解析函数,将接受的url、description和自己新增id构造一个Link对象,并将Link对象增加到links当中,返回一个Link对象,也就是刚刚新建的link.这里我们必须返回一个Link对象,因为schema中已经很明确的写出Link!。

  这里我们可以看到args的作用,args实际代表了查询传递的参数:{url:url, description: description}

重启服务器,我们可以在playground中测试一下mutaition

mutation {
  post(
    url: "www.prisma.io"
    description: "Prisma turns your database into a GraphQL API"
  ) {
    id
  }
}

  这样便会新增一条数据。但新增的数据会随着浏览器页面的刷新而消失。

 

 

 

 

 

posted @ 2018-09-09 15:38  tutu_python  阅读(121)  评论(0)    收藏  举报