Graphql apollo 服务器解析器参数类型
Posted
技术标签:
【中文标题】Graphql apollo 服务器解析器参数类型【英文标题】:Graphql apollo server resolvers arguments types 【发布时间】:2021-08-22 02:02:45 【问题描述】:类型脚本显示错误,未提及每个参数的参数类型:
Mutation:
createUser: (parent, args, context, info) =>
我可以使用任何类型来解决,但正确的类型是什么?
Mutation:
createUser: (parent: any, args: any, context: any, info: any) =>
【问题讨论】:
不应该是createUser: resolve: (parent, args, context, info) =>
吗?无论如何,指定类型应该是可选的。
【参考方案1】:
如果您在tsconfig.json
中启用所有严格的类型检查选项,则应为所有内容添加 TS 类型。
我们来看看解析器的类型。
export declare type IFieldResolver<TSource, TContext, TArgs = Record<string, any>> = (source: TSource, args: TArgs, context: TContext, info: GraphQLResolveInfo &
mergeInfo: MergeInfo;
) => any;
解析器参数:
parent
- 对于没有父级的***字段的解析器(例如Query
、Mutation
的字段),此值为undefined
。所以TS类型是undefined
args
- 从类型可以看出,它必须满足泛型约束Record<string, any>
中的类型参数。由于实际参数是从 Graphql 客户端传递的,因此我们需要为每个解析器定义 Args
类型/接口。
context
- 泛型参数,需要我们自己定义应用上下文接口。
info
- TS 类型已经存在 GraphQLResolveInfo & mergeInfo: MergeInfo
一个工作示例:
例如
import express from 'express';
import ApolloServer, gql, MergeInfo from 'apollo-server-express';
import GraphQLResolveInfo from 'graphql';
const app = express();
const typeDefs = gql`
type User
email: String!
type Query
user: User
type Mutation
createUser(email: String!, password: String!): Boolean
`;
export declare type IFieldResolver<TSource, TContext, TArgs = Record<string, any>> = (source: TSource, args: TArgs, context: TContext, info: GraphQLResolveInfo &
mergeInfo: MergeInfo;
) => any;
type CreateUserArgs =
email: string;
password: string;
;
interface AppContext
userService: UserService;
const resolvers =
Query: ,
Mutation:
createUser: (
parent: undefined,
args: CreateUserArgs,
context: AppContext,
info: GraphQLResolveInfo & mergeInfo: MergeInfo ,
) =>
console.log(parent);
return context.userService.createUser(args.email, args.password);
,
,
;
interface UserService
createUser(email: string, password: string): boolean;
class UserServiceImpl
createUser(email: string, password: string)
return true;
const server = new ApolloServer(
typeDefs,
resolvers,
context:
userService: new UserServiceImpl(),
,
);
server.applyMiddleware( app, path: '/graphql' );
app.listen(8080, () => console.log('Apollo server started at http://localhost:8080'));
软件包版本:
"typescript": "^3.9.6",
"apollo-server": "^2.15.1",
"graphql": "^14.6.0",
客户端的 GraphQL 查询:
mutation
createUser(email: "teresa@gmail.com", password: "1234")
回复:
"data":
"createUser": true
登录服务器端:
Apollo server started at http://localhost:8080
undefined
【讨论】:
在我看来,您的上下文类型不正确......数据源等呢?你知道是否有内置的 Context 类型吗?以上是关于Graphql apollo 服务器解析器参数类型的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 apollo / graphql 实现节点查询解析器
在客户端解析器中导入类型时,如何避免使用 Apollo 客户端和“graphql-codegen”的角度项目中的循环依赖?