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 - 对于没有父级的***字段的解析器(例如QueryMutation的字段),此值为undefined。所以TS类型是undefined

args - 从类型可以看出,它必须满足泛型约束Record&lt;string, any&gt;中的类型参数。由于实际参数是从 Graphql 客户端传递的,因此我们需要为每个解析器定义 Args 类型/接口。

context - 泛型参数,需要我们自己定义应用上下文接口。

info - TS 类型已经存在 GraphQLResolveInfo &amp; 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 Server:将参数传递给嵌套解析器

Apollo GraphQL:未在突变子字段上调用解析器

在客户端解析器中导入类型时,如何避免使用 Apollo 客户端和“graphql-codegen”的角度项目中的循环依赖?

如何使用 Apollo 分离 GraphQL 模式和解析器文件?

合并 Apollo 服务器的 GraphQL 解析器不使用 Object.assign()