如何将 Express REST 层放在 Apollo GraphQL 服务器之上?
Posted
技术标签:
【中文标题】如何将 Express REST 层放在 Apollo GraphQL 服务器之上?【英文标题】:How can I put an Express REST layer on top of an Apollo GraphQL server? 【发布时间】:2018-12-08 23:32:03 【问题描述】:我正在考虑在 GraphQL 服务器 (Apollo Server v2) 之上放置一个 REST 层(使用 Express)来支持一些旧版应用程序。为了尽可能多地共享逻辑,理想情况下,REST 端点应该包装我发送到 GraphQL 服务器的 GraphQL 查询,并且能够在将响应发送到客户端之前对响应进行小的修改。
我无法找出从 Express 路由中间件查询 apollo 服务器的最佳方式。到目前为止,我已经探索了两种不同的解决方案:
-
修改来自 REST 端点的请求,使
req.body
成为有效的 graphql 查询,将 req.url
更改为 /graphql
,然后调用 next()
。这样做的问题是,我无法在将结果发送到客户端之前对其进行修改,而我需要这样做。
从路由中间件用axios调用/graphql
端点,在发送给客户端之前修改响应。这行得通,但我觉得有点 hacky。
您还有其他建议,或者甚至是一个例子吗?
【问题讨论】:
【参考方案1】:我相信解决方案 2 可以实施。
我做了一个类似的实现,但在我的例子中,一个 GraphQL 服务从另一个(多个)GraphQL 服务获取数据。 在某个地方,我做了这样的事情:
export type serviceConnectionType =
endpoint: string
queryType:
query: Object // gql Object Query
variables:
input: Object // query arguments (can be null)
export async function connectService(params: serviceConnectionType)
const response = await fetch(params.endpoint,
method: 'POST',
headers: 'Content-Type': 'application/json' ,
body: JSON.stringify(params.queryType),
)
if (response.status === 404)
console.warn('404 not found')
return response.json()
【讨论】:
以上是关于如何将 Express REST 层放在 Apollo GraphQL 服务器之上?的主要内容,如果未能解决你的问题,请参考以下文章
如何在没有 Apollo Server 但使用 express-graphql 的情况下使用 apollo-datasource-rest
将 Express.js-REST-Endpoint 与 Meteor 应用程序集成
如何使用 Advanced REST Client 或 Postman 测试 Express/node REST API 后端?