English | 简体中文
推荐直接阅读 Midway 官方文档部分:GraphQL | Midway
V3 版本见 apollo-server-midway-v3(开发中)
现在你可以在 Midway Serverless 中使用 Apollo-Server(V3) 和 TypeGraphQL 了:
- 支持
Apollo Server
与TypeGraphQL
绝大部分在Serverless
场景下的可用配置 - 支持
Serverless
应用(通过Apollo-Server
作为解析器) 与 普通 Node 应用(通过Apollo-Server
作为中间件,已支持koa
/Express
版本) - 内置开箱即用的插件功能,如 Query Complexity、Resolve Time 等,后续还会有更多插件。
- 集成
Midway Container
的Debug
能力(如在GraphQL Response
中通过extensions
字段返回上下文、GraphQL Schema
等信息) - 基于 Apollo Server V3,默认禁用
Apollo Sandbox
,使用GraphQL Playground
- 90+ 单测覆盖率
在开始前,你可以通过 experimental-midway-sls-graphql 和 sample 来了解大概的使用方式。
在 Serverless 场景中使用 apollo-server-midway :
npm install apollo-server-midway graphql type-graphql --save
yarn add apollo-server-midway graphql type-graphql --save
pnpm install apollo-server-midway graphql type-graphql --save
type-graphql
是可选的依赖,如果你已经拥有构建完毕的 GraphQL Schema,可以不使用它。同时,请确保你在 MidwayJS 项目中使用,因为包括@midwayjs/core
以及@midwayjs/decorator
等的一批依赖被标记为peerDependencies
。
import {
Provide,
Inject,
ServerlessTrigger,
ServerlessFunction,
ServerlessTriggerType,
App,
} from "@midwayjs/decorator";
import { Context, IMidwayFaaSApplication } from "@midwayjs/faas";
import { createApolloServerHandler } from "apollo-server-midway";
import { SampleResolver } from "../resolvers/sample.resolver";
import { DogResolver } from "../resolvers/dog.resolver";
import path from "path";
const apolloHandlerFuncName = "apollo-handler";
const APOLLO_SERVER_MIDWAY_PATH = "/apollo";
@Provide()
export class HelloHTTPService {
@Inject()
ctx: Context;
@App()
app: IMidwayFaaSApplication;
@ServerlessFunction({
functionName: apolloHandlerFuncName,
})
@ServerlessTrigger(ServerlessTriggerType.HTTP, {
path: APOLLO_SERVER_MIDWAY_PATH,
method: "get",
})
@ServerlessTrigger(ServerlessTriggerType.HTTP, {
path: APOLLO_SERVER_MIDWAY_PATH,
method: "post",
})
async apolloHandler() {
return await createApolloServerHandler({
path: "/",
app: this.app,
context: this.ctx,
schema: {
resolvers: [SampleResolver, DogResolver],
},
});
}
}
在上面的示例中,函数 apollo-handler
将被部署在 SLS_DOMAIN/SERVICE/apollo-handler
下,你可以通过 SLS_DOMAIN/SERVICE/apollo-handler/
访问(注意 /
)。
npm install apollo-server-midway graphql type-graphql @midwayjs/koa --save
yarn add apollo-server-midway graphql type-graphql @midwayjs/koa --save
pnpm install apollo-server-midway graphql type-graphql @midwayjs/koa --save
将
@midwayjs/koa
替换为你应用对应的框架,目前仅有 Koa / Express 支持。
你可以查看 koa-app-sample / express-app-sample 获得更多信息。
在普通 Node 应用中,更推荐通过自己定义 GraphQL
中间件的方式来接入 GraphQL Server,因为其成本是非常低的,同时相比框架的黑盒,你可以更容易的做定制。Apollo-Server-Midway
同样会更侧重 Serverless 能力相关,因为对于花样百出的 Node 应用定制需求,我们无法做到满足每一个使用者。关于如何定制,请参考 文档-定制 GraphQL 中间件。
// config.default.ts
import { SampleResolver } from "../resolvers/sample.resolver";
import { CreateGraphQLMiddlewareOption } from "apollo-server-midway";
export const graphql: CreateGraphQLMiddlewareOption = {
schema: {
resolvers: [SampleResolver],
},
};
// configuration.ts
import { Configuration, App } from "@midwayjs/decorator";
import { ILifeCycle } from "@midwayjs/core";
import { IMidwayKoaApplication } from "@midwayjs/koa";
import * as GraphQL from "apollo-server-midway";
@Configuration({
imports: [GraphQL],
importConfigs: ["./config"],
})
export class ContainerConfiguration implements ILifeCycle {
@App()
app: IMidwayKoaApplication;
async onReady(): Promise<void> {
this.app.use(
// Express 下的命名空间:graphql:GraphQLExpressMiddleware
await this.app.generateMiddleware("graphql:GraphQLKoaMiddleware")
);
}
}
MIT