问题描述
学习 GraphQL 并且有点坚持将 req 传递到我为保持整洁而制作的生成上下文函数中。
我想我对 createContext((req) => req)
行做了一些愚蠢的事情,好像我在路由处理程序中 console.log( ctx.request )
我得到 [Function (anonymous)]
从 server.ts 范围捕获 this.req 并将其传递给 createContext 的替代方法是什么?
server.ts
import { ApolloServer } from 'apollo-server'
import { schema } from './nexusSchema'
import { createContext } from './context'
const server = new ApolloServer({
schema,context: createContext((req) => req),})
server.listen().then(({ url }) => {
console.log(`? Server ready at ${url}`)
})
context.ts
import { prismaClient,prisma as prismaTypes } from '@prisma/client'
import { prismaDelete,onDeleteArgs } from '@paljs/plugins'
import { PubSub } from 'apollo-server'
class prisma extends prismaClient {
constructor(options?: prismaTypes.prismaClientOptions) {
super(options)
}
async onDelete(args: onDeleteArgs) {
const prismaDelete = new prismaDelete(this)
await prismaDelete.onDelete(args)
}
}
const prisma = new prisma()
const pubsub = new PubSub()
export interface Context {
prisma: prisma
select: any
pubsub: PubSub
request: {
request: {
headers: {
authorization: string
}
}
connection: {
context: {
Authorization: string
}
}
}
}
export function createContext(req): Context {
return {
prisma,select: {},pubsub,request: req,}
}
解决方法
毕竟我是个笨蛋。
注意,我还必须调整请求对象的接口以适应 Apollo Server 2!
server.ts
const server = new ApolloServer({
schema,context: createContext,})
context.ts
export interface Context {
prisma: Prisma
select: any
pubsub: PubSub
request: {
req: {
headers: {
authorization: string
}
}
connection: {
context: {
Authorization: string
}
}
}
}
export const createContext = (req): Context => {
return {
prisma,select: {},pubsub,request: req,}
}