Graphql apollo 服务器解析器参数类型

Lor*_*ord 12 node.js typescript graphql typescript-typings apollo-server

类型脚本显示错误,未提及每个参数的参数类型:

  Mutation: {
    createUser: (parent, args, context, info) =>{

    }
Run Code Online (Sandbox Code Playgroud)

我可以使用任何类型来解决,但是正确的类型是什么?

  Mutation: {
    createUser: (parent: any, args: any, context: any, info: any) =>{

    }
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

sli*_*wp2 14

如果您启用所有严格的类型检查选项tsconfig.json,则应该为所有内容添加 TS 类型。

我们来看看解析器的类型。

export declare type IFieldResolver<TSource, TContext, TArgs = Record<string, any>> = (source: TSource, args: TArgs, context: TContext, info: GraphQLResolveInfo & {
 mergeInfo: MergeInfo;
}) => any;
Run Code Online (Sandbox Code Playgroud)

解析器参数:

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'));
Run Code Online (Sandbox Code Playgroud)

软件包版本:

export declare type IFieldResolver<TSource, TContext, TArgs = Record<string, any>> = (source: TSource, args: TArgs, context: TContext, info: GraphQLResolveInfo & {
 mergeInfo: MergeInfo;
}) => any;
Run Code Online (Sandbox Code Playgroud)

客户端的 GraphQL 查询:

mutation{
  createUser(email: "teresa@gmail.com", password: "1234")
}
Run Code Online (Sandbox Code Playgroud)

回复:

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'));
Run Code Online (Sandbox Code Playgroud)

登录服务器端:

Apollo server started at http://localhost:8080
undefined
Run Code Online (Sandbox Code Playgroud)

  • 在我看来,您的上下文类型不正确......数据源等怎么样?你知道是否有内置的 Context 类型? (3认同)