第一种方式: 首先来看一下,官方给出的koa-graphql的例子,
```js
var express = require('express');
var {graphqlHTTP} = require('express-graphql');
var { buildSchema } = require('graphql');
var fs = require('fs');
const { resolve } = require('path');
var schema = buildSchema(`
type Query {
hello: String
world: String
}
`);
const getdata = () =>{
return new Promise(resolve =>{
setTimeout(() => {
resolve('OK11')
}, 500);
})
}
var root = {
hello: (ctx) => ctx ,
world:async () => {
return await getdata() ;
}
};
var app = express();
app.use('/graphql', function(req,res, next) {
console.log(req.query);
next();
}, graphqlHTTP({
schema: schema, //查询结构体
rootValue: root, // 返回结果
}));
```js
原来官方的例子中用的是hello ,通过在rootValue中传入一个对象,对象中各个字段为属性,函数为属性值,返回一个数据结果。
支持异步结果。比如,数据库查询,RPC调用等等。
第二种方式: 通过读取.gql 后缀文件,通过graphql库中的buildSchema方法,传入fs读取后的文件。如下:
const schema = buildSchema(fs.readFileSync(__dirname + '/schema/comment.gql', 'utf-8'));
通过schema.getQueryType().getFields().comment.resolve 来定义字段的resolve函数 其中comment是字段 ---------------出自杨浩老师,在极客时间中node课程
该函数范围一个Promise即可。
第三种方式: 使用graphql-tools包,分别定义resolver 和 gql 结构,就能用该包的自带方法 makeExecutableSchema,将二者结合。最后挂载到koa或者express的路由 上。但是这种方式要注意resovler的写法,如下列子。定义的数据结构是
type Post {
id: ID!
title: String
author: Author
votes: Int
}
type Query {
posts: [Post]
}
那么对应的resolve函数应该用一下写法。
const resolver = {
Query:{
post(){
return posts
}
}
}
所有查询字段,都在Query这个对象中,定义方法。
以上就是我整理的3种在koa-graphql , express-graphql 中定义 查询字段结果的resolver函数的方法。仅供大家参考。