官方描述:
GraphQL 既是一种用于 API 的查询语言也是一个知足你数据查询的运行时。 GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端可以准确地得到它须要的数据,并且没有任何冗余,也让 API 更容易地随着时间推移而演进,还能用于构建强大的开发者工具。javascript
// 两趟查询,难以拓展 GET /user/111 GET /article/1001?comment=2
// 一趟查询,易于扩展 { article (id: 1001){ title, author, time, comments (first: 2) nickname, time, content } }, user (id: 111){ nickname, photo, sign } }
GraphQL为express和koa提供了插件,能够方便的搭建GraphQL服务器。
看下面的代码:前端
var express = require('express'); var graphqlHTTP = require('express-graphql'); var { buildSchema } = require('graphql'); // 使用 GraphQL schema language 构建 schema var schema = buildSchema(` input MessageInput { content: String author: String } type Message { id: ID! content: String author: String } type Query { getMessage(id: ID!): Message } type Mutation { createMessage(input: MessageInput): Message updateMessage(id: ID!, input: MessageInput): Message } `); // 若是 Message 拥有复杂字段,咱们把它们放在这个对象里面。 class Message { constructor(id, {content, author}) { this.id = id; this.content = content; this.author = author; } } // 映射 username 到 content var fakeDatabase = {}; var root = { getMessage: function ({id}) { if (!fakeDatabase[id]) { throw new Error('no message exists with id ' + id); } return new Message(id, fakeDatabase[id]); }, createMessage: function ({input}) { // Create a random id for our "database". var id = require('crypto').randomBytes(10).toString('hex'); fakeDatabase[id] = input; return new Message(id, input); }, updateMessage: function ({id, input}) { if (!fakeDatabase[id]) { throw new Error('no message exists with id ' + id); } // This replaces all old data, but some apps might want partial update. fakeDatabase[id] = input; return new Message(id, input); }, }; var app = express(); app.use('/graphql', graphqlHTTP({ schema: schema, rootValue: root, graphiql: true, })); app.listen(4000, () => { console.log('Running a GraphQL API server at localhost:4000/graphql'); });
咱们经过GraphQL提供的语法,创建一个schema,相似typescript的interface。
有多种基本类型:ID, String, Int, []。
Query是查询操做,Mutation是增删改操做。
因此这里,咱们提供了一个getMessage的方法,返回Message类型的信息。
Mutation类型这里咱们提供了createMessage,和updateMessage两个方法。java
定义完schema,还须要定义方法的处理:
定义root对象进行函数处理。node
执行node index.js
。而后访问localhost:4000/graphql就能够看到相应的调试页面。(前提是graphiql:true)。
这个调试页面仍是很方便的。
打开调试页面,先create一个message:
而后查询这个message:
mysql
type 为query的时候,能够不写query。git
var dice = 1; var sides = 6; var query = `query RollDice($dice: Int!, $sides: Int) { rollDice(numDice: $dice, numSides: $sides) }`; fetch('/graphql', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', }, body: JSON.stringify({ query, variables: { dice, sides }, }) }) .then(r => r.json()) .then(data => console.log('data returned:', data));
这是官网给的试例。fetch请求,把query传过去就能够啦,若是请求的是个函数,须要传参variables。如上dice和sides两个参数github
这里给个链接mysql的schema和rootValuesql
var { buildSchema } = require('graphql'); const mysqlCon = require('./mysql'); // 使用 GraphQL schema language 构造一个 schema let count = 0; var schema = buildSchema(` type UserInfo { id: ID! name: String uid: Int age: Int sex: String createdTime: String updatedTime: String description: String } type Query { getUsers: [UserInfo] getUserById(id: ID!): UserInfo } type Mutation { invokeCount: Int } `); // root 为每一个端点入口 API 提供一个解析器 var root = { async getUsers() { count += 1; let users = await mysqlCon.pifySelect('select * from Tab_User_Info'); console.log(users); return users; }, async getUserById({id}) { let users = await mysqlCon.pifySelect(`select * from Tab_User_Info where id=${id}`) return users[0]; }, invokeCount() { return count; } }; module.exports = { root, schema, }
mysql.jsdocker
const mysql = require('mysql'); const connection = mysql.createConnection({ host: '127.0.0.1', port: 3306, user: 'root', password: '123456', database: 'Test_User' }); connection.connect(function(err) { if (err) { console.error('error: ' + err.stack); return; } }); Object.defineProperty(connection, 'pifySelect', { value: function(sql) { return new Promise((resolve, _)=>{ connection.query(sql, function (error, results) { if (error) console.log('mysql select err:', error); resolve(results); }); }) } }) module.exports = connection
用docker搞个mysql环境:typescript
docker pull mysql:5.6 docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
docker exec -it mysql bash
进入bash而后初始化一下mysql,插几个数据用来操做。
用koa-graphql或者express-graphql启一个服务,就能够直接访问啦。
facebook, twitter,github,咱们公司(toutiao)部分业务在用。