获取请求时出现Elm NetworkError,但控制台说它很好

时间:2018-02-19 18:40:41

标签: http haskell elm scotty

我正在Elm中构建我的第一个Web应用程序,我遇到了这个问题,当我向本地服务器发出get请求时,Elm说它是' NetworkError'即使浏览器控制台说它有效。

我做了如下最小例子:

服务器由Haskell和Scotty组成:

{-# LANGUAGE OverloadedStrings #-}
module Main where

import Web.Scotty
import Data.Text.Lazy (pack)

main :: IO ()
main = scotty 3000 $ get "/" $ text $ pack "a"

所有这一切都是回复字母' a'当你对localhost:3000做一个get请求时。 Elm应用程序只显示响应(如果有),如果有响应则显示错误,并且按钮用于执行获取请求:

import Http exposing (getString, send, Error)
import Html exposing (Html, text, br, button, body, program)
import Html.Events exposing (onClick)

type Msg
  = DataRequest (Result Error String)
  | Refresh

type alias Model =
  { response : String
  , err : String
  }

main : Program Never Model Msg
main = program
  { init = init
  , view = view
  , update = update
  , subscriptions = subscriptions
  }

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

init : (Model, Cmd Msg)
init = ({ response = "", err = ""} , Cmd.none)

update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
  case msg of
    DataRequest (Err err) -> ({ model | err = toString err},     Cmd.none)
    DataRequest (Ok response) -> ({model | response = response}, Cmd.none)
    Refresh -> (model, send DataRequest (getString "http://localhost:3000"))

view : Model -> Html Msg
view {response, err} =
  body []
    [ text <| "Response: " ++ response
    , br [] []
    , text <| "Error: " ++ err
    , br [] []
    , button [ onClick Refresh ] [ text "Send request" ]
    ]

这是我执行get请求时浏览器控制台的屏幕截图。我对这些东西并不是很了解,但就我所见,它看起来很好。 Screenshot of browser console

我想要的是“响应”&#39;显示字母&#39; a&#39;在它之后,&#39;错误&#39;是空白的。相反,错误&#39;是&#39; NetworkError&#39;和“回应”#39;是空白的。

我已经把这个最小的例子放在一个Git仓库中,以防有人亲切地尝试并告诉我出了什么问题:

https://github.com/8n8/elmnetworkerror

(我知道在Elm http request returns NetworkError for successful requests有一个非常相似的问题但是还没有答案,我认为它会从一个完整的最小例子中受益。)

1 个答案:

答案 0 :(得分:7)

我不能说你的错误是什么,但由于CORS我得到错误:

Main.elm:1 Failed to load http://localhost:3000/:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://localhost:8000' is therefore not allowed access.

因此,我已调整您的Main.{hs,elm}以便在访问发生时从同一服务器提供文件:

Main.elm

Refresh -> (model, send DataRequest (getString "/data"))

Main.hs

main = scotty 3000 $ do
  get "/" $ file "../index.html"
  get "/data" $ text $ pack "a"

而不是使用elm-reactor我运行elm-make src/Main.elm --output=index.html