2017-10-20 4 views
0

저는 Elm 0.18에서 graphql을 사용하려고합니다. 제가 온라인에서 찾은 라이브러리는 0.18에서 작동하지 않는 것 같습니다. 그래서 저는 제 자신을 압연하고 있습니다.Elm에서의 graphql 처리 오류 (0.18)

내가 중첩 된 쿼리를 가지고 있다고 가정 해 봅시다.

그것을 통해 가고, GetPostCompleted에 반환 Post 유형에 따라 통과
import Http 
import HttpBuilder exposing (..) 
import Json.Decode as Decode exposing (..) 
import Json.Encode as Encode exposing (..) 
import Json.Decode.Pipeline as Pipeline exposing (decode, required) 

fetchPosts : Model -> Cmd Msg 
fetchPosts model = 
    let 
    graphiql = 
     """ 
     query { 
      postById(id: 1) { 
      id 
      author { 
       id 
       name 
      } 
      content 
      comments { 
       date 
       author { 
       id 
       name 
       } 
       content 
      } 
      } 
     } 
     """ 

    localUserDecoder = 
     Pipeline.decode User 
     |> Pipeline.required "id" Decode.int 
     |> Pipeline.required "name" Decode.string 

    localCommentDecoder = 
     Pipeline.decode Comment 
     |> Pipeline.required "date" Decode.string 
     |> Pipeline.required "author" localUserDecoder 
     |> Pipeline.required "string" Decode.string 

    localPostDecoder = 
     Pipeline.decode Post 
     |> Pipeline.required "id" Decode.int 
     |> Pipeline.required "author" localUserDecoder 
     |> Pipeline.required "content" Decode.string 
     |> Pipeline.required "comments" (Decode.list localCommentDecoder) 

    localDecoder = 
     Decode.at [ "data", "postById" ] <| 
      localPostDecoder 
    in 
     HttpBuilder.post ("http://myserver/api") 
      |> HttpBuilder.withStringBody "text/plain" graphiql 
      |> HttpBuilder.withExpect (Http.expectJson localDecoder) 
      |> HttpBuilder.send GetPostCompleted 

는, 모두가 잘 : 쿼리 및 HTTP 호출을 함수는 다음과 같이 보인다. 그러나 무언가가 꺼져 있다고 가정 해보십시오. author이 어딘가에 user으로 잘못 표시되었거나 필드가 디코더에서 순서가 잘못되었습니다. 컴파일러는 오류를 만든 곳을 알려주지 않고 네트워크 테이블에서 올바른 쿼리를 볼 수 있지만 elm 코드에서 발생하는 설명이 아닌 오류 만 표시합니다.

구조화 방법이 없으므로 디코더 중 하나에 이상이있는 경우 콘솔에 오류가 표시 될 수 있습니까? 현재 나는 모든 것을 풀어서 조각으로 묶어야합니다. 이것은 매우 어렵고 느릅 나무 같은 것입니다.

답변

2

0.18을 지원하지 않는 graphql 라이브러리에 대해 잘 모르겠습니다.

더 큰 질문은 입력 된 느릅 나무 자료 구조에서 (효과적으로) 유형화 된 graphql 요청 및 해당 디코더로 갈 수없는 이유입니다. 그러나 물론 컴파일러가 목표로하는 것보다 높은 레벨의 사운드를 분석해야합니다. (generic을 사용하여 Haskell에서이 작업을 수행하는 방법은 https://www.youtube.com/watch?v=sh4H8yzXnvw을 참조하십시오.)

결과적으로 기존 라이브러리도 원하는 것보다 많은 보일러 플레이트가 필요합니다. 이 문제를 해결할 방법이 없습니다.

느릅 나무 레코드 유형의 필드를 반복 할 수 있지만 직접 생성 된 디코더를 얻을 수 없다면 요청을 더 직접 작성할 수 있습니다. 나는 확실하지 않다 무엇

당신이 graphql JSON 정의를 구문 분석하고 내가 느릅 나무에 여전히 새로운 해요 그

+0

에서 느릅 나무 디코더를 유도,하지만 난 형 시스템에 대한 불만을 들었다 수 있는지 여부입니다. 이것이 사람들이 불평하는 주요한 것입니까? –

+1

아니요, 불만 사항은 유형 분류에 관한 것이며 불필요한 보일러 판으로 내려갑니다. 여기에서는 훨씬 더 진보 된 타입의 시스템이 필요할 것입니다 (하스켈 또는 그 이상을 생각하십시오) –