我有一个如下定义的自定义上下文,我将其传递给 Mercurius。
export interface Context {
prisma: PrismaClient
}
const prisma = new PrismaClient()
export const context: Context = {
prisma: prisma,
}
我的 Mercurius 定义如下。
app.register(mercurius, {
schema,
resolvers,
graphiql: true,
context: () => context /* This is the context object from above */,
})
我很难定义接受上下文对象的
resolvers
。
根据 Mercurius 文档,调用解析器函数时,第二个参数是 Graphql 中传递给它的参数,第三个参数是上下文对象。但是,如果我定义了如下所示的解析器,我会从 Typescript 中收到错误。
const resolvers = {
Query: {
findFirst: async (_:any, args:any, ctx:Context) => {
//...
}
}
};
Mercurius 似乎定义了预期的签名,其中上下文参数的类型为
MercurialContext
。就我而言,我的上下文不需要 MercuriusContext
中的额外信息,因此我不扩展它。所以,我被迫声明我的解析器如下。
const resolvers = {
Query: {
findFirst: async (_:any, args:any, ctx:any) => {
//...Then in my code I am using 'ctx as Context' to force it into my object
}
}
};
Typescript 有什么优雅的方式来处理这个问题吗?
import type { IResolvers } from 'mercurius'
const resolvers: IResolvers = {
Query: {
findFirst: async (_:any, args:any, ctx:any) => {
…
}
}
}
我创建了一个声明文件来重新定义
MercuriusContext
,以便我可以手动设置其类型。请参阅参考
interface PrismaContext {
prisma: PrismaClient
}
declare module 'mercurius' {
interface MercuriusContext extends PrismaContext {
// Same Interface members as the original MercuriusContext
app: FastifyInstance;
reply: FastifyReply;
operationsCount?: number;
operationId?: number;
__currentQuery: string;
pubsub: PubSub;
}
}
注册 Mercurius
const prisma = new PrismaClient()
app.register(mercurius, {
//...
context: () => {
return { prisma: prisma }
}
})
然后在您的 Mercurius 解析器中
export const resolverName = async (_parent: unknown, _args: unknown, context: PrismaContext) => {
const { prisma } = context;
// Resolver code
}