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
}
}
这样便会新增一条数据。但新增的数据会随着浏览器页面的刷新而消失。
浙公网安备 33010602011771号