我只是试着做了一下GraphQL.js的教程
我是一个初学者。我只是按照这个教程自己尝试,并将结果以备忘录的形式写下来。请多关照。
开始使用GraphQL.js | GraphQL.js教程
学习如何使用GraphQL.js
GraphQL.js的安装
yarn add graphql
const { graphql, buildSchema } = require('graphql');
// GraphQLスキーマ言語を使用して、スキーマを構築
const schema = buildSchema(`
type Query {
hello: String
}
`);
// ルートは各APIエンドポイントにリゾルバー機能を提供する
const root = {
hello: () => {
return 'Hello world!';
},
};
// GraphQLクエリ '{ hello }' を実行してレスポンスを出力
graphql(schema, '{ hello }', root).then((response) => {
console.log(response);
});
$ node server.js
{ data: [Object: null prototype] { hello: 'Hello world!' } }
运行一个 Express GraphQL 服务器
安装必需的库以在Express中执行。
yarn add express express-graphql graphql
创建API服务器
const express = require('express');
const graphqlHTTP = require('express-graphql');
const { buildSchema } = require('graphql');
const schema = buildSchema(`
type Query {
hello: String
}
`);
const root = {
hello: () => {
return 'Hello world!';
},
};
const app = express();
app.use('/graphql', graphqlHTTP({
schema: schema,
rootValue: root,
graphiql: true,
}));
app.listen(4000);
console.log('Running a GraphQL API server at http://localhost:4000/graphql');
$ node server.js
Running a GraphQL API server at http://localhost:4000/graphql
由于设置了 `graphiql: true`,您可以使用 GraphiQL。
GraphQL客户端
- curlでgraphqlを実行する
$ curl -X POST -H "Content-Type: application/json" -d '{"query": "{ hello }"}' http://localhost:4000/graphql
{"data":{"hello":"Hello world!"}}
-
- GUIで実行する場合はGraphiQLやInsomniaなどを使う
- ブラウザから実行する
打开 http://localhost:4000/graphql 的开发工具,并复制粘贴以下内容。
fetch('/graphql', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
},
body: JSON.stringify({query: "{ hello }"})
})
.then(r => r.json())
.then(data => console.log('data returned:', data));
基本类型
GraphQL的Schema语言支持String、Int、Float、Boolean和ID这几种标量类型,因此可以直接在传递给buildSchema的Schema中使用它们。
默认情况下,所有类型都允许为null值。将任意一个标量类型返回为null是合法的。通过使用感叹号,可以表示该类型不可为null,例如String!表示不可为null的字符串。
const express = require('express');
const graphqlHTTP = require('express-graphql');
const { buildSchema } = require('graphql');
const schema = buildSchema(`
type Query {
quoteOfTheDay: String
random: Float!
rollThreeDice: [Int]
}
`);
const root = {
quoteOfTheDay: () => {
return Math.random() < 0.5 ? 'Take it easy' : 'Salvation lies within';
},
random: () => {
return Math.random();
},
rollThreeDice: () => {
return [1, 2, 3].map(_ => 1 + Math.floor(Math.random() * 6));
},
};
const 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');
我可以确认已经以指定的类型获取到了数据。
传递参数 dì shū)
定义一个名为rollDice的函数,该函数接受numDice和numSides作为参数。
type Query {
rollDice(numDice: Int!, numSides: Int): [Int]
}
const express = require('express');
const graphqlHTTP = require('express-graphql');
const { buildSchema } = require('graphql');
const schema = buildSchema(`
type Query {
rollDice(numDice: Int!, numSides: Int): [Int]
}
`);
const root = {
rollDice: ({numDice, numSides}) => {
const output = [];
for (let i = 0; i < numDice; i++) {
output.push(1 + Math.floor(Math.random() * (numSides || 6)));
}
return output;
}
};
const 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');
确认带参数的延迟
在设置参数时,最好使用$语法。
const dice = 3;
const sides = 6;
const 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));
物体类型
请指定对象类型并返回值。
const express = require('express');
const graphqlHTTP = require('express-graphql');
const { buildSchema } = require('graphql');
const schema = buildSchema(`
type RandomDie {
numSides: Int!
rollOnce: Int!
roll(numRolls: Int!): [Int]
}
type Query {
getDie(numSides: Int): RandomDie
}
`);
class RandomDie {
constructor(numSides) {
this.numSides = numSides;
}
rollOnce() {
return 1 + Math.floor(Math.random() * this.numSides);
}
roll({numRolls}) {
const output = [];
for (let i = 0; i < numRolls; i++) {
output.push(this.rollOnce());
}
return output;
}
}
const root = {
getDie: ({numSides}) => {
return new RandomDie(numSides || 6);
}
}
const 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');
{
getDie(numSides: 6) {
numSides
rollOnce
roll(numRolls: 3)
}
}
突变和输入类型
创建或更新数据可以使用mutatison而不是query进行发送。
为了简化模式,建议使用input关键字而不是type关键字。
const express = require('express');
const graphqlHTTP = require('express-graphql');
const { buildSchema } = require('graphql');
const 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
}
`);
class Message {
constructor(id, {content, author}) {
this.id = id;
this.content = content;
this.author = author;
}
}
const fakeDatabase = {};
const root = {
getMessage: ({id}) => {
if (!fakeDatabase[id]) {
throw new Error('no message exists with id ' + id);
}
return new Message(id, fakeDatabase[id]);
},
createMessage: ({input}) => {
const id = require('crypto').randomBytes(10).toString('hex');
fakeDatabase[id] = input;
return new Message(id, input);
},
updateMessage: ({id, input}) => {
if (!fakeDatabase[id]) {
throw new Error('no message exists with id ' + id);
}
fakeDatabase[id] = input;
return new Message(id, input);
},
};
const 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');
});
确认数据创建
确认数据更新