Как я могу поместить слой Express REST поверх сервера Apollo GraphQL? - PullRequest
0 голосов
/ 29 июня 2018

Я планирую поместить слой REST (используя Express) поверх сервера GraphQL (Apollo Server v2) для поддержки некоторых устаревших приложений. Чтобы разделить как можно больше логики, конечная точка REST в идеале должна обернуть запрос GraphQL, который я отправляю на сервер GraphQL, и иметь возможность вносить небольшие изменения в ответ перед отправкой ответа клиенту.

У меня проблемы с поиском лучшего способа запроса сервера apollo из промежуточного программного обеспечения Express-маршрутизации. До сих пор я исследовал два разных решения:

  1. Измените запрос от конечной точки REST таким образом, чтобы req.body был действительным запросом graphql, измените req.url на /graphql и вызовите next(). Проблема в том, что я не могу изменить результат до его отправки клиенту, что мне нужно сделать.
  2. Вызов конечной точки /graphql с помощью axios из промежуточного программного обеспечения маршрутизации и изменение ответа перед отправкой клиенту. Это работает, но мне кажется немного хакерским.

У вас есть другие предложения или, может быть, даже пример?

1 Ответ

0 голосов
/ 06 июля 2018

Я считаю, что решение 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()
}
...