我尝试使用带有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
某处,或者字段在解码器中出现故障。编译器不会告诉我我在哪里犯了错误,而是在网络表中看到一个正确的查询,但是从我的榆树代码中抛出了一个非描述性的错误。
有没有办法构造这个,以便,如果其中一个解码器出现问题,我可以看到控制台抛出错误或什么?目前我必须拆开整个东西并将它拼凑在一起,这是非常困难和非榆树般的。
答案 0 :(得分:2)
对于不支持0.18的graphql库,我不确定你是否正确。
更大的问题是为什么不可能从类型化的elm数据结构转变为(有效)类型的graphql请求,以及相应的解码器。但这当然需要分析类型,这听起来比编译器的目标要高。 (请参阅https://www.youtube.com/watch?v=sh4H8yzXnvw了解如何使用泛型在Haskell中完成此操作)
因此,即使现有的图书馆也需要比您希望的更多的锅炉板。我没有看到解决方法。
如果您可以迭代Elm记录类型的字段,您可以更直接地构建请求,但即便如此,您也无法使用自动生成的解码器...我认为。
我不确定您是否可以解析graphql json定义并从中导出elm解码器