在Elm中处理graphql时出错(0.18)

时间:2017-10-20 16:55:26

标签: graphql elm

我尝试使用带有Elm 0.18的graphql。我在网上找到的图书馆似乎不能使用0.18,所以我自己动手。

我们说我有一个嵌套查询。使查询和http调用的函数看起来像这样:

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

当它通过并将返回的Post类型传递给GetPostCompleted时,一切都很顺利。但是假设某些东西已经关闭。我错误地将author标记为user某处,或者字段在解码器中出现故障。编译器不会告诉我我在哪里犯了错误,而是在网络表中看到一个正确的查询,但是从我的榆树代码中抛出了一个非描述性的错误。

有没有办法构造这个,以便,如果其中一个解码器出现问题,我可以看到控制台抛出错误或什么?目前我必须拆开整个东西并将它拼凑在一起,这是非常困难和非榆树般的。

1 个答案:

答案 0 :(得分:2)

对于不支持0.18的graphql库,我不确定你是否正确。

更大的问题是为什么不可能从类型化的elm数据结构转变为(有效)类型的graphql请求,以及相应的解码器。但这当然需要分析类型,这听起来比编译器的目标要高。 (请参阅https://www.youtube.com/watch?v=sh4H8yzXnvw了解如何使用泛型在Haskell中完成此操作)

因此,即使现有的图书馆也需要比您希望的更多的锅炉板。我没有看到解决方法。

如果您可以迭代Elm记录类型的字段,您可以更直接地构建请求,但即便如此,您也无法使用自动生成的解码器...我认为。

我不确定您是否可以解析graphql json定义并从中导出elm解码器