API 参考文档:ApolloServer
本篇文章文档了
查看我们的
构造函数
示例
import { ApolloServer } from '@apollo/server';const server = new ApolloServer({typeDefs,resolvers,});
import { ApolloServer } from '@apollo/server';const server = new ApolloServer({typeDefs,resolvers,});
选项
名称 / 类型 | 描述 |
---|---|
指定模式 | |
| 有效的Schema Definition Language(SDL)字符串、文档或文档,代表您的服务器接口模式GraphQL模式。要生成文档,可以将 有关示例,请参阅定义您的GraphQL模式。 |
| 为个人模式字段填充数据的函数图。也可以是多个图合并的数组。 虽然技术上可选,如果您提供 有关详细信息,请参阅 解析器。 |
| 可执行的 GraphQL 模式。在内部,Apollo Server 自动从这个 如果以下情况适用,这个字段很有用:
|
| 您可以使用此字段将您的服务器与 Apollo Gateway 集成。 |
模式选项 | |
| 如果 默认值是 |
| 一个自定义 解析器,它将替换 Apollo Server's 默认字段解析器。 |
| 一个值或函数,它会接收解析的 如果要根据操作细节(例如,是否是一个 查询 或 突变)使用不同的根值,那么提供一个函数是非常有用的。 |
| 一个包含自定义函数的数组,用作额外的 验证规则,用于在验证操作时对照模式。请注意,这些规则应仅依赖于操作和模式,而不应依赖于特定于单个请求的任何其他内容,因为成功验证的结果会在请求之间进行缓存。 |
| 一个键值缓存,Apollo Server 使用它来存储之前遇到的 GraphQL 操作 Apollo Server(作为 每当 Apollo Server 接收一个传入的操作时,它会检查该确切的操作是否存在于其 默认的 要使用
将 |
协议选项 | |
| 如果你正在使用 自动化持久查询(APQ),你可以提供一个包含 |
| 默认情况下, CSRF 防护功能已启用,以保护 Apollo Server 免受 CSRF 和 XS-Search攻击。 此功能可以防止某些 如果你的服务器有发送 你可以通过传递 |
| 提供此函数以在将错误对象发送到客户端之前转换其结构。 The |
| 一个包含连接Apollo Server到Apollo Studio配置选项的对象。此对象的每个字段也可以通过环境变量设置,这是设置这些参数的建议方法。Apollo Studio。所有字段都是可选的。字段包括:
|
| 控制是否允许在单个HTTP请求中批处理查询。批量请求查询默认为 |
生命周期选项 | |
| A 默认缓存是一个 有关配置Apollo Server缓存的更多信息,请参阅配置缓存后端。 |
| 一个要在您的服务器实例中安装的插件插件数组。 您可以在启动服务器之前使用 Apollo Server自带一些插件,如果满足某些条件,它会在默认配置下自动安装。例如,如果提供了图API密钥和graph ref,则会安装使用情况报告插件。如果手动提供插件(在 |
| 默认情况下,每当 Apollo Server 收到一个 将此选项设置为 在成功返回 您还可以在其他上下文中手动调用 |
调试选项 | |
| 如果 默认情况下为 |
| 一个用于记录而不使用 如果您提供此值,Apollo Server 将自动记录所有严重级别的消息(从 此记录器将自动添加到传递给所有 Apollo Server 插件函数 的 |
| 一个指定您的服务器如何解析 GraphQL 操作的 请参阅 |
| 如果设置为任何字符串值,将使用该值而不是环境变量 |
| 将此选项设置为 Apollo Server v5 将始终以此选项为 true 的方式操作(并将忽略提供的任何值)。 |
| ⚠️ 注意:此选项可能导致安全漏洞和意外的行为。Apollo 不支持在生产中使用此选项。 当设置为 如果您在构建时处理操作验证并将只有已知的、经过验证的操作允许在运行时执行,您可能会对此选项感兴趣。请注意,操作验证将缓存到 Apollo Server 的文档存储中。 |
start
异步 start
方法指示 Apollo Server 准备处理即将到来的操作。
仅在您为非无服务器环境使用框架集成(例如,expressMiddleware
)时调用 start
。
如果您使用的是无服务器框架集成(如 Lambda),则不应在将您的服务器传递给集成函数之前调用此方法。您的无服务器集成函数会为您处理服务器的启动。
如果您使用
startStandaloneServer
,则无需在将服务器直接传递给 startStandaloneServer 之前启动您的服务器。
始终在将您的服务器传递给您的集成函数并开始接受请求之前调用 await server.start()
:
const server = new ApolloServer<MyContext>({typeDefs,resolvers,});await server.start();app.use('/graphql', cors<cors.CorsRequest>(), express.json(), expressMiddleware(server));
const server = new ApolloServer({typeDefs,resolvers,});await server.start();app.use('/graphql', cors(), express.json(), expressMiddleware(server));
这使得您可以通过终止进程来响应 Apollo Server 启动失败,而不是开始接收流量。
如果您正在使用 executeOperation
测试您的服务器(即,您并未实际启动一个 HTTP 服务器),则无需调用 start()
,因为 executeOperation
会为您完成这一操作。
触发动作
start
方法会触发以下动作:
- 如果您的服务器是一个 联邦网关,它将尝试获取其模式。如果获取失败,
start
会抛出一个错误。 - 您的服务器将调用已安装的所有插件的
serverWillStart
处理器。如果有任何这些处理器引发错误,start
会抛出一个错误。
startInBackgroundHandlingStartupErrorsByLoggingAndFailingAllRequests
无服务器集成通过调用 Apollo Server 实例的 startInBackgroundHandlingStartupErrorsByLoggingAndFailingAllRequests
方法在后台启动实例。这种方法是 同步的,不需要 awaited
。这意味着发生的任何错误都发生在后台,因此您无法立即处理它们。有关详细信息,请参阅 构建集成。
addPlugin
您可以使用 addPlugin
方法在服务器启动前添加插件。当您想添加一个接受您初始化 ApolloServer
实例本身的插件时,这非常有用:
const server = new ApolloServer({typeDefs,plugins: [makeFirstPlugin()],});server.addPlugin(makeSecondPlugin(server));
const server = new ApolloServer({typeDefs,plugins: [makeFirstPlugin()],});server.addPlugin(makeSecondPlugin(server));
assertStarted
框架集成应调用 server.assertStarted()
确保服务器在接收请求之前已启动。有关详细信息,请参阅 构建集成。
stop
ApolloServer.stop()
是一个异步方法,告诉 Apollo Server 的所有后台任务完成。具体来说,它会:
- 调用并等待所有
drainServer
插件处理器。这些应通常:- 停止监听新连接
- 关闭空闲连接(即,没有当前 HTTP 请求的连接)
- 当它们变为空闲时关闭活动连接
- 等待所有连接关闭
- 宽限期过后,如果存在任何活动连接,强制关闭它们。如果你使用
startStandaloneServer
,则默认会执行此操作。否则,你可以使用 drain HTTP server 插件 来排空你的 HTTP 服务器。
- 将服务器转换为不会执行更多:GraphQL 操作 的状态。
- 调用并等待所有
serverWillStop
插件处理程序(包括 usage reporting 插件's 处理程序,该处理程序会将最终使用报告发送到 Apollo Studio)。 - 如果你的服务器是一个 联邦网关,则
stop
也会停止特定于网关的后台活动,例如轮询更新的服务配置。
此方法不接受任何参数。您只能在 start()
成功返回(或您已经调用 startStandaloneServer
并使用您的 ApolloServer
实例)之后调用它。
在某些情况下,Apollo Server 会自动在进程接收到 SIGINT
或 SIGTERM
信号时调用 stop
。有关详细信息,请参阅 stopOnTerminationSignals
构造函数选项。
executeOperation
异步 executeOperation
方法主要用于通过 Apollo Server 的请求流水线而无需发送 HTTP 请求来测试 GraphQL 操作。
const response = await server.executeOperation({query: 'query SayHelloWorld($name: String) { hello(name: $name) }',variables: { name: 'world' },});
executeOperation
方法接受两个参数:
- 第一个参数是一个描述要执行的 GraphQL 操作的对象。
- 支持的字段列在下表中。
- 第二个参数是可选的选项对象。此对象包含操作的可选
contextValue
。此参数是可选的,前提是你的服务器 不需要一个上下文值(即,你的服务器使用默认上下文,因为您没有明确提供另一个上下文)。
const response = await server.executeOperation({query: 'query SayHelloWorld($name: String) { hello(name: $name) }',variables: { name: 'world' },}, {contextValue: { userId: 'test' },});
从 executeOperation
返回的 response
对象是一个 GraphQLResponse
,它具有 body
和 http
字段。
Apache Server 4 支持增量交付指令,例如直接量,如@defer
和@stream
(当与适当的graphql-js
版本结合时),因此response.body
的结构可以表示单个结果或多个结果。response.body.kind
可以是'single'
或'incremental'
。如果是'single'
,则未使用增量交付,response.body.singleResult
是一个具有data
、errors
和extensions
字段的对象。如果是'incremental'
,则response.body.initialResult
是操作的初始结果,response.body.subsequentResults
是一个异步迭代器,将产出后续结果。(initialResult
和subsequentResults
的确切结构由graphql-js
定义,并且在graphql-js
v17的当前预发布版和最终发布版之间可能会有变化;如果您在graphql-js
v17发布前编写用于处理这些值的代码,您可能需要在API最终确定时对其进行修改。)
The http字段包含可选的数字状态码和一个headers
映射,用于指定任何应设置的HTTP状态码和头部。
下面是executeOperation
的第一个参数可用字段:
字段
名称 | 描述 |
---|---|
| 必需. 运行的GraphQL操作。请注意,即使操作是mutation,也必须使用 |
| 包含任何GraphQL变量作为执行操作参数值的对象。 |
| 如果 |
| The |
| 一个实现 |
executeHTTPGraphQLRequest
The executeHTTPGraphQLRequest
方法是 web 框架集成的入口。您可以向 executeHTTPGraphQLRequest
方法传递 HTTPGraphQLRequest
对象以执行 GraphQL 请求:
const result = await server.executeHTTPGraphQLRequest({httpGraphQLRequest: OurHttpGraphQLRequest,context: async () => ({// token: ...,}),});
const result = await server.executeHTTPGraphQLRequest({httpGraphQLRequest: OurHttpGraphQLRequest,context: async () => ({// token: ...,}),});
有关详细信息和方法示例,请参阅 Building Integrations。
缓存
ApolloServer 公共只读字段,允许您访问服务器缓存。
logger
ApolloServer 公共只读字段,允许您访问服务器的日志。