当参数与工作示例相同时,为什么Elm不会为JSON数据示例编译此HTTP请求?

问题描述 投票:0回答:1

我正在研究一个基本的解码json Elm示例,但无法找出Elm编译错误。我也感到困惑,为什么它在Ellie中运行(即带有远程JSON URL),但在使用Elm v 19.0 FYI在本地编译时却不能运行。

目标是进行一个简单的调用以从Go服务器获取JSON,但仅编译我从文档中获得的用于解码JSON的示例Elm无法正常工作,所以我们在这里。

module HelloWorld exposing (..)


import Browser
import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (..)
import Http
import Json.Decode exposing (Decoder, field, string)



-- MAIN


main =
  Browser.element
    { init = init
    , update = update
    , subscriptions = subscriptions
    , view = view
    }



-- MODEL


type Model
  = Failure
  | Loading
  | Success String


init : () -> (Model, Cmd Msg)
init _ =
  (Loading, getRandomCatGif)



-- UPDATE


type Msg
  = MorePlease
  | GotGif (Result Http.Error String)


update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
  case msg of
    MorePlease ->
      (Loading, getRandomCatGif)

    GotGif result ->
      case result of
        Ok url ->
          (Success url, Cmd.none)

        Err _ ->
          (Failure, Cmd.none)



-- SUBSCRIPTIONS


subscriptions : Model -> Sub Msg
subscriptions model =
  Sub.none



-- VIEW


view : Model -> Html Msg
view model =
  div []
    [ h2 [] [ text "Random Cats" ]
    , viewGif model
    ]


viewGif : Model -> Html Msg
viewGif model =
  case model of
    Failure ->
      div []
        [ text "I could not load a random cat for some reason. "
        , button [ onClick MorePlease ] [ text "Try Again!" ]
        ]

    Loading ->
      text "Loading..."

    Success url ->
      div []
        [ button [ onClick MorePlease, style "display" "block" ] [ text "More Please!" ]
        , img [ src url ] []
        ]



-- HTTP


getRandomCatGif : Cmd Msg
getRandomCatGif =
  Http.get
    { url = "http://127.0.0.1:8080/test"
    , expect = Http.expectJson GotGif gifDecoder
    }


gifDecoder : Decoder String
gifDecoder =
  field "data" (field "image_url" string)

和现在的go服务器

// write json back to elm call

package main

import (
    "fmt"
    "log"
    "net/http"
    "os"

    "github.com/gorilla/schema"
)

type ToDo struct {
    Title       string
    Description string
}

func main() {

    http.HandleFunc("/test", test)

    http.ListenAndServe(getPort(), nil)

}

func getPort() string {
    p := os.Getenv("PORT")
    if p != "" {
        return ":" + p
    }
    return ":8080"
}

func test(w http.ResponseWriter, r *http.Request) {
    if r.Method == "GET" {
        //Allow CORS here By * or specific origin
        w.Header().Set("Access-Control-Allow-Origin", "*")
        // say hi
        fmt.Fprintf(w, "hello from go"+"\n")

    } else {
        //Allow CORS here By * or specific origin
        w.Header().Set("Access-Control-Allow-Origin", "*")

        todo := readForm(r)
        fmt.Fprintf(w, "updated todo to"+todo.Title+"\n")
    }
}

func readForm(r *http.Request) *ToDo {
    r.ParseForm()
    todo := new(ToDo)
    decoder := schema.NewDecoder()
    decodeErr := decoder.Decode(todo, r.PostForm)
    if decodeErr != nil {
        log.Printf("error mapping parsed form data to struct : ", decodeErr)
    }
    return todo
}

最后是ELM错误榆树make ./src/HelloWorld.elm

Detected problems in 1 module.
-- TYPE MISMATCH -------------------------------------------- src/HelloWorld.elm

Something is off with the body of the `getRandomCatGif` definition:

110|>  Http.get
111|>    { url = "http://127.0.0.1:8080/test"
112|>    , expect = Http.expectJson GotGif gifDecoder
113|>    }

This `get` call produces:

    Decoder a -> Http.Request a

But the type annotation on `getRandomCatGif` says it should be:

    Cmd Msg

-- TYPE MISMATCH -------------------------------------------- src/HelloWorld.elm

The 1st argument to `get` is not what I expect:

110|   Http.get
111|>    { url = "http://127.0.0.1:8080/test"
112|>    , expect = Http.expectJson GotGif gifDecoder
113|>    }

This argument is a record of type:

    { expect : b, url : String }

But `get` needs the 1st argument to be:

    String

-- TYPE MISMATCH -------------------------------------------- src/HelloWorld.elm

The 1st argument to `expectJson` is not what I expect:

112|     , expect = Http.expectJson GotGif gifDecoder
                                    ^^^^^^
This `GotGif` value is a:

    Result Http.Error String -> Msg

But `expectJson` needs the 1st argument to be:

    Decoder a

-- TOO MANY ARGS -------------------------------------------- src/HelloWorld.elm

The `expectJson` function expects 1 argument, but it got 2 instead.

112|     , expect = Http.expectJson GotGif gifDecoder
                    ^^^^^^^^^^^^^^^
Are there any missing commas? Or missing parentheses?
go elm
1个回答
0
投票

似乎您已安装elm/http模块的1.0.0版本,而该示例需要elm/http模块2.0.0。我可以使用此软件包的1.0.0版本重现您的错误,但是该代码已成功使用2.0.0编译。

编辑您的elm.json文件,将elm/http的版本更改为2.0.0,然后尝试再次运行elm make ...

© www.soinside.com 2019 - 2024. All rights reserved.