要使用apollo-server-express和自定义GraphQL模式指令,首先需要安装所需的依赖包。
npm install apollo-server-express graphql graphql-directive
const express = require('express');
const { ApolloServer, gql } = require('apollo-server-express');
const { SchemaDirectiveVisitor } = require('graphql-tools');
const { defaultFieldResolver } = require('graphql');
// 自定义模式指令
class UpperCaseDirective extends SchemaDirectiveVisitor {
visitFieldDefinition(field) {
const { resolve = defaultFieldResolver } = field;
field.resolve = async function (...args) {
const result = await resolve.apply(this, args);
if (typeof result === 'string') {
return result.toUpperCase();
}
return result;
};
}
}
// 定义模式
const typeDefs = gql`
directive @upper on FIELD_DEFINITION
type Query {
hello: String @upper
}
`;
// 定义解析器
const resolvers = {
Query: {
hello: () => 'Hello World!'
}
};
// 创建Apollo服务器
const server = new ApolloServer({
typeDefs,
resolvers,
schemaDirectives: {
upper: UpperCaseDirective
}
});
// 创建Express应用程序
const app = express();
// 将Apollo服务器安装到Express应用程序中
server.applyMiddleware({ app });
// 启动服务器
app.listen({ port: 4000 }, () =>
console.log(`Server ready at http://localhost:4000${server.graphqlPath}`)
);
在这个例子中,我们定义了一个自定义模式指令@upper
,它会将返回的字符串转换为大写形式。然后,我们将这个指令应用到Query类型的hello字段上。
当我们访问http://localhost:4000/graphql
时,会返回HELLO WORLD!
作为响应。
希望这个例子可以帮助你使用apollo-server-express和自定义GraphQL模式指令。