将请求传递到函数中生成的 Apollo Server 上下文中

问题描述

学习 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,}
}