I want to perform a basic Ajax request, that's all.
I use reflex
for the frontend and Scotty
for the backend. The Firefox Web Console tells me the request was a success and I see the expected result there. But the website switches from Just "default"
to Nothing
instead of Just "success!"
.
Here is a complete minimal example:
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
and the Scotty
part:
{-# 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!"
Since the debug tools tell me the request was a success, I suspect the error somewhere near decodeXhrResponse
but I am a bit lost how I should proceed debugging since it just gets compiled to (unreadable) Javascript.
I used the try-reflex Nix script from GitHub to set up everything and compiled with ghcjs hello.hs
in the Nix environment.
Edit: Adding the output of curl
:
$ curl -G http://localhost:3000/mystring
success!%