基本的な Ajax リクエストを実行したいだけです。
reflex
フロントエンドとバックエンドに使用しScotty
ます。Firefox Web コンソールに、リクエストが成功したことが示され、期待どおりの結果が表示されます。Just "default"
しかし、ウェブサイトはからNothing
ではなく に切り替わりますJust "success!"
。
完全な最小限の例を次に示します。
import Reflex (holdDyn)
import Reflex.Dom (button, el, mainWidget, display)
import Reflex.Dom.Xhr (performRequestAsync, xhrRequest, decodeXhrResponse)
import Reflex.Class (tag, constant)
import Data.Default (def)
main :: IO ()
main = do
mainWidget $ el "div" $ do
buttonEvent <- button "click me"
let defaultReq = xhrRequest "GET" "mystring" def --served by Scotty
asyncEvent <- performRequestAsync (tag (constant defaultReq) buttonEvent)
buttonDyn <- holdDyn (Just "default") $ fmap decodeXhrResponse asyncEvent
display buttonDyn
そしてそのScotty
部分:
{-# LANGUAGE OverloadedStrings #-}
import Web.Scotty
import Network.Wai.Middleware.Static
main = scotty 3000 $ do
middleware $ staticPolicy (noDots >-> addBase "/mnt/b/haskell/try-reflex/hello.jsexe")
get "/" $ do
file "/mnt/b/haskell/try-reflex/hello.jsexe/index.html"
get "/mystring" $ html "success!"
デバッグツールはリクエストが成功したことを教えてくれるので、どこかにエラーdecodeXhrResponse
があるのではないかと思いますが、(読み取り不能な) Javascript にコンパイルされるだけなので、デバッグをどのように進めるべきか少し迷っています。
GitHub の try-reflex Nix スクリプトを使用してすべてをセットアップしghcjs hello.hs
、Nix 環境でコンパイルしました。
編集:の出力を追加curl
:
$ curl -G http://localhost:3000/mystring
success!%