我正在练习一个基本的解码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错误
榆树制作./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?
最佳答案
看起来您已经安装了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 ...
。
关于go - 当参数与工作示例相同时,Elm为什么不为JSON数据示例编译此HTTP请求?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59902563/