【问题标题】:How can I put an Express REST layer on top of an Apollo GraphQL server?如何将 Express REST 层放在 Apollo GraphQL 服务器之上?
【发布时间】: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。
您还有其他建议,或者甚至是一个例子吗?
【问题讨论】:
标签:
node.js
express
graphql
apollo-server
【解决方案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()
}