如何使用GraphQL
快速开始
通过下面的代码,我们可以快速使用GraphQL实现查询。
import { graphql, buildSchema } from 'graphql';
const schema = buildSchema(/* GraphQL */ `
type Query {
hello: String
}
`);
const root = { hello: () => 'Hello world!' };
const response = await graphql({
schema,
source: /* GraphQL */ `
{
hello
}
`,
rootValue: root
});
console.log(response);
使用graphql-tools
我们可以使用graphql-tools来使用GraphQL。
首先我们先创建两个GraphQL文件。
query.graphql
#import './human.graphql'
type Query {
hello: String
human(age: Int): Human
}
human.graphql
type Human {
name: String
age: Int
}
创建一个方法,用于加载GraphQL文件。
import { URL } from 'node:url';
import { loadSchema } from '@graphql-tools/load';
import { GraphQLFileLoader } from '@graphql-tools/graphql-file-loader';
export async function getSchema(file, importMetaUrl) {
const urlResult = decodeURIComponent(new URL(file, importMetaUrl).pathname);
return loadSchema(urlResult, {
loaders: [new GraphQLFileLoader()]
});
}
实现查询。
import { graphql } from 'graphql';
import { addResolversToSchema } from '@graphql-tools/schema'
import { getSchema } from './utils.js';
const resolvers = {
Query: {
hello(obj, args, context, info) {
return '你好';
},
human(obj, args, context, info) {
return {
name: '小明',
age: args.age + obj.$add()
};
}
}
};
const schema = await getSchema('./query.graphql', import.meta.url);
const schemaWithResolvers = addResolversToSchema({ schema, resolvers });
const response = await graphql({
schema: schemaWithResolvers,
source: /* GraphQL */ `
{
hello
human(age: 56) {
name
age
}
}
`,
rootValue: {
$add() {
return 32;
}
}
});
console.log(response.data);
webpack配置
如果要通过webpack来配置使用,首先要配置loader。
export default {
mode: 'development',
module: {
rules: [
{
test: /^.*\.(gql|graphql)$/,
loader: '@graphql-tools/webpack-loader',
options: {
importHelpers: true
}
}
]
}
};
然后在项目中使用。
import { graphql, buildASTSchema } from 'graphql';
import query from './query.graphql';
const root = {
hello() {
return '你好';
},
human() {
return {
name: '小明',
age: 14
};
}
}
graphql({
schema: buildASTSchema(query),
source: /* GraphQL */ `
{
hello
human {
name
age
}
}
`,
rootValue: root
}).then((response) => {
console.log(response);
});