一种用于API的查询语言。
△GraphQL在应用中所处的位置
res.data.result
。而GraphQL提供的数据查询方式可以只获取需要的数据。先推荐一个开放API,拥有无穷无尽数据的美国太空探索技术公司spaceX的官方API
express 项目名
搭建脚手架npm install graphql express-graphql axios
此处安装axios是为了直接发送请求获取数据,也可选择使用Postman中的GraphQL测试
app.js
文件中设置路由,表示所有的客户端请求都由GraphQL的requst handler处理const graphqlHTTP = require('express-graphql');
const schema = require('./schema');
app.use('/graphql', graphqlHTTP({
schema,
graphiql: true
}));
graphqlHTTP是grapql的http服务,用于处理graphql的查询请求,它接收一个options参数,其中schema是一个 GraphQLSchema实例,graphiql设置为true可以在浏览器中直接对graphQL进行调试。
schema.js
文件,定义两个数据模型:LaunchType(发射)和 RocketType(火箭)const { GraphQLObjectType, GraphQLInt, GraphQLString, GraphQLBoolean, GraphQLList, GraphQLSchema } = require('graphql');
const LaunchType = new GraphQLObjectType({
name: 'Launch',
fields: () => ({
flight_number: { type: GraphQLInt },
mission_name: { type: GraphQLString },
launch_date_local: { type: GraphQLString },
launch_success: { type: GraphQLBoolean },
rocket: { type: RocketType },
})
});
const RocketType = new GraphQLObjectType({
name: 'Rocket',
fields: () => ({
rocket_id: { type: GraphQLString },
rocket_name: { type: GraphQLString },
rocket_type: { type: GraphQLString }
})
});
schema中的数据类型要使用GraphQL提供的类型系统中的类型,不能使用javascript中的数据类型
const axios = require('axios');
const RootQuery = new GraphQLObjectType({
name: 'RootQueryType',
fields: {
launches: {
type: new GraphQLList(LaunchType),
resolve(parent, args) {
return axios.get('https://api.spacexdata.com/v3/launches').then(res => res.data);
}
}
}
});
module.exports = new GraphQLSchema({
query: RootQuery
});
RootQuery是所有查询的入口,用于处理并返回数据
项目文件夹下npm start
,浏览器中输入 http://localhost:5000/graphql (需要在/bin文件夹下的www
文件中指定端口号)启动GraphiQL
schema.js
:
const RootQuery = new GraphQLObjectType({
name: 'RootQueryType',
fields: {
...
launch: { // 新的schema
type: LaunchType,
args: { // 添加参数
flight_number: {
type: GraphQLInt
}
},
resolve(parent, args) {
return axios.get(`https://api.spacexdata.com/v3/launches/${args.flight_number}`).then(res => res.data);
}
}
}
});
待续…