Как установить CORs с помощью пьедестала Lacinia?

#server #clojure #cors #graphql #pedestal

#сервер #clojure #cors #graphql #пьедестал

Вопрос:

Я настраиваю сервер graphql на базе lacinia-piedestra с использованием Clojure и пытаюсь получить к нему доступ с помощью клиентского кода javascript с использованием apollo. Однако я не могу получить доступ к конечной точке / graphql на localhost, потому что я пытаюсь получить к ней доступ с источника localhost (localhost: 3000), который не разрешен CORs. Как мне установить CORs с помощью lacinia-piedestment?

Вот код на стороне сервера (настраивается с помощью руководства по lacinia https://lacinia.readthedocs.io/en/latest/tutorial/component.html )

 (ns project.server
  (:require [com.stuartsierra.component :as component]
            [com.walmartlabs.lacinia.pedestal :as lp]
            [io.pedestal.http :as http]))

(defrecord Server [schema-provider server]

  component/Lifecycle

  (start [this]
    (assoc this :server (-> schema-provider
                            :schema
                            (lp/service-map {:graphiql true})
                            http/create-server
                            http/start)))

  (stop [this]
    (http/stop server)
    (assoc this :server nil)))

(defn new-server
  []
  {:server (-> {}
               map->Server
               (component/using [:schema-provider]))})
  

Клиентский код очень прост (с использованием Apollo):

 const client = new ApolloClient({
  uri: "http://localhost:8888/graphql"
});
  

Комментарии:

1. Какое точное сообщение об ошибке браузер регистрирует в консоли devtools?

2. Сообщение об ошибке было «404 не найдено», хотя мне удалось это исправить (см. Ответ ниже).

Ответ №1:

Обновление: Мне удалось решить проблему, объединив мою сервисную карту пьедестала lacinia со стандартной сервисной картой пьедестала.

  (start [this]
    (assoc this :server (-> schema-provider
                            :schema
                            (lp/service-map {:graphiql true})
                            (merge {::http/allowed-origins (constantly true)})
                            http/create-server
                            http/start)))