如何将 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 后端?

检查 Node.js REST API 上的资源所有权

如何使用 nodejs 和 express 在 REST API 中实现搜索和过滤

如何使用 PayPal Express Checkout 集成(客户端 REST)获取交易 ID