如何将现有GraphQLSchema对象传入Apollo的makeExecutableSchema函数
在GraphQL中集成graphql-iso-date标量类型到makeExecutableSchema
我来帮你搞定这个问题!要把graphql-iso-date提供的标量类型(比如GraphQLDate)和你自定义的类型定义、解析器配合使用,只需要两步就能实现:
步骤1:在类型定义中声明标量
GraphQL需要明确知道你用到的Date是一个自定义标量类型,所以得先在typeDefs里添加标量声明:
import { GraphQLDate, GraphQLTime, GraphQLDateTime } from 'graphql-iso-date'; let typeDefs = []; // 先声明要使用的标量类型 typeDefs.push(` scalar Date scalar Time scalar DateTime `); // 再添加你的自定义业务类型 typeDefs.push(` type MyType { date: Date } `);
步骤2:在解析器中映射标量实现
接下来要把你声明的标量名称和graphql-iso-date提供的具体实现关联起来,只需要在resolvers对象里添加对应的键值对:
let resolvers = { // 把标量类型绑定到对应的实现上 Date: GraphQLDate, // 如果需要用到Time或DateTime,也一起加上 // Time: GraphQLTime, // DateTime: GraphQLDateTime, Query: () => { /* ... */ }, };
完整可用的示例代码
把这些整合起来,最终的代码如下:
import { GraphQLDate, GraphQLTime, GraphQLDateTime } from 'graphql-iso-date'; import { makeExecutableSchema } from '@graphql-tools/schema'; let typeDefs = []; typeDefs.push(` scalar Date scalar Time scalar DateTime `); typeDefs.push(` type MyType { date: Date time: Time dateTime: DateTime } type Query { getSampleData: MyType } `); let resolvers = { Date: GraphQLDate, Time: GraphQLTime, DateTime: GraphQLDateTime, Query: { getSampleData: () => { // 这里可以直接返回JS Date对象,graphql-iso-date会自动处理序列化和解析 return { date: new Date(), time: new Date(), dateTime: new Date() }; } }, }; const schema = makeExecutableSchema({ typeDefs, resolvers });
简单解释下原理
- 标量声明是告诉GraphQL:
Date不是它内置的类型,是一个你自定义的标量,需要用特定逻辑处理数据的序列化(JS对象转GraphQL响应格式)和解析(客户端传入的字符串转JS对象)。 - 解析器里的映射则是把这个标量名称和
graphql-iso-date已经封装好的解析/序列化逻辑绑定,这样GraphQL就知道该怎么处理这个类型的数据了。
内容的提问来源于stack exchange,提问作者kub1x
相关产品推荐
相关产品推荐

