poverholt

poverholt

Web Development with Clojure, Third Edition: correct reference code (page 116)

In general, how do I correctly find the reference code that matches each book topic?

More specifically, I am having problems around page 116 testing that the code still works after setting up shadow-cljs. I tried using the reference code called “guestbook-shadow” and still had the same problems. Maybe I am using the wrong reference code. The problems I see are…

  • I don’t always see the “WebSocket connected!” in the browser. I have not figured out yet exactly when this happens.
  • GET /api/messages response is always 500 “Internal Server Error”
  • The page never gets passed “Loading Messages…”
  • Sometimes I get this error about invalid gy flags in xregexp.
  • I get some error about protocol_mask partition.
  • The browser console shows errors about formatters not being installed and another about custom formatters not being rendered.
  • On the positive side, the browser console reports App initilized and components mounted and shadow-cljs ready.

How do I debug this? A server-side unit test of get-messages responds with 200, so I think the problem is in middleware or the websocket config. I was hoping the reference code would help, but assuming I have the right one, it is the same, with exception of some SQL files.

I am enjoying the book very much & looking forward to getting past this hump. Thanks for your hard work.

Regards,
Pete

Most Liked

svmbrown

svmbrown

Author of Web Development with Clojure

You can find the reference code here under the “Resources” section.

The “WebSocket Connected” message not appearing is likely due to shadow-cljs being inactive or still compiling. You can try getting more info from the browser console, or check the CLI output for a message that looks like [:app] Build Completed. (...)

The 500 from /api/messages could be plenty of things. Validating the get-messages function is a good start, that means it’s likely an issue with the route itself. Check the logs for an error, and if that’s not descriptive, add a log statement at the very beginning of your handler fn to make sure you enter it. If not, it’s likely an issue with the :parameters or :responses validation, but it could be another route issue. If you do get the log statement, wrap the handler body in a try/catch and log the error before re-throwing to get more info. Sometimes the error can get obfuscated by the middleware stack.

The page never getting past “loading messages…” is a result of the 500 most likely, since they’re failing to load.

The gy flags in xregexp is a version issue. Try bumping the version and removing core-js dependency.

I am not sure what the protocol_mask partition issue is, so that would need some further investigation. Sorry I can’t be helpful there. Try seeking out help from shadow-cljs documentation or open an issue on the shadow-cljs github repository if you can’t resolve it. https://github.com/thheller/shadow-cljs

The formatters sounds like an issue with cljs-devtools chrome plugin. It shouldn’t be an issue with the application itself.

Good luck with the debugging. Share your logs and relevant code if you’re still stuck.

Glad to hear you’re enjoying the book so far, thanks for reading!

poverholt

poverholt

Thanks for such a detailed response Scot! It really helped me get back on track. Everything is behaving as expected now.

With the try/catch suggestion, I figured out the database was corrupted or missing. Once re-generated, I was at least getting some data back. I couldn’t successfully regenerate just by using the repl and commands in env/dev/clj/user. It seems I had to use the OS to delete the DB files. Is there a simple and reliable way to regenerate the DB?

Making sure my project.clj dependencies, especially ClojureScript, was updated to match the sample code for the shadow section helped get rid of several errors. Switching from Firefox to Chrome and using Web Dev settings under “console” to "enable custom formatters helped too. I often get burned by cached web pages, but I am starting to remember to look to that first when I see unexpected behavior. Can I use any browser or is Chrome required during development?

I am looking forward to the re-frame work. Thanks again, Pete.

svmbrown

svmbrown

Author of Web Development with Clojure

Glad to hear you got things sorted out!

You can use any browser, but chrome/chromium has a slight edge with support for devtools. My workflow tends to be to get stuff working in chromium and then validate in firefox once things are fairly complete.

With regards to regenerating the DB from the REPL, it largely depends on what went wrong. luminus-migrations does provide rollback and reset functions, but that will only be as good as your migrations are. If you’ve made an error in writing a migration file, it won’t help. I’d recommend using SQL (either from your favourite client or from the REPL) to inspect the structure of your tables and compare against what you expect.

Happy Hacking!

Scot

Where Next?

Popular Pragmatic Bookshelf topics Top

jimschubert
In Chapter 3, the source for index introduces Config on page 31, followed by more code including tests; Config isn’t introduced until pag...
New
mikecargal
Title: Hands-On Rust (Chap 8 (Adding a Heads Up Display) It looks like ​.with_simple_console_no_bg​(SCREEN_WIDTH*2, SCREEN_HEIGHT*2...
New
edruder
I thought that there might be interest in using the book with Rails 6.1 and Ruby 2.7.2. I’ll note what I needed to do differently here. ...
New
AndyDavis3416
@noelrappin Running the webpack dev server, I receive the following warning: ERROR in tsconfig.json TS18003: No inputs were found in c...
New
jskubick
I’m running Android Studio “Arctic Fox” 2020.3.1 Patch 2, and I’m embarrassed to admit that I only made it to page 8 before running into ...
New
digitalbias
Title: Build a Weather Station with Elixir and Nerves: Problem connecting to Postgres with Grafana on (page 64) If you follow the defau...
New
oaklandgit
Hi, I completed chapter 6 but am getting the following error when running: thread 'main' panicked at 'Failed to load texture: IoError(O...
New
creminology
Skimming ahead, much of the following is explained in Chapter 3, but new readers (like me!) will hit a roadblock in Chapter 2 with their ...
New
tkhobbes
After some hassle, I was able to finally run bin/setup, now I have started the rails server but I get this error message right when I vis...
New
roadbike
From page 13: On Python 3.7, you can install the libraries with pip by running these commands inside a Python venv using Visual Studio ...
New

Other popular topics Top

PragmaticBookshelf
Write Elixir tests that you can be proud of. Dive into Elixir’s test philosophy and gain mastery over the terminology and concepts that u...
New
Exadra37
Please tell us what is your preferred monitor setup for programming(not gaming) and why you have chosen it. Does your monitor have eye p...
New
PragmaticBookshelf
Rust is an exciting new programming language combining the power of C with memory safety, fearless concurrency, and productivity boosters...
New
AstonJ
Thanks to @foxtrottwist’s and @Tomas’s posts in this thread: Poll: Which code editor do you use? I bought Onivim! :nerd_face: https://on...
New
Exadra37
I am asking for any distro that only has the bare-bones to be able to get a shell in the server and then just install the packages as we ...
New
Maartz
Hi folks, I don’t know if I saw this here but, here’s a new programming language, called Roc Reminds me a bit of Elm and thus Haskell. ...
New
foxtrottwist
A few weeks ago I started using Warp a terminal written in rust. Though in it’s current state of development there are a few caveats (tab...
New
First poster: AstonJ
Jan | Rethink the Computer. Jan turns your computer into an AI machine by running LLMs locally on your computer. It’s a privacy-focus, l...
New
sir.laksmana_wenk
I’m able to do the “artistic” part of game-development; character designing/modeling, music, environment modeling, etc. However, I don’t...
New
AstonJ
This is a very quick guide, you just need to: Download LM Studio: https://lmstudio.ai/ Click on search Type DeepSeek, then select the o...
New

Sub Categories: