A huge con for NodeJS I've encountered this week is no easy way to do things syncronysly vs asyncronysly (spelling?) I had to write a migration script this week to convert a json structure in Firebase to a different order to accommodate a new layout style. Roughly looping through a page - getting the articles that belong to that page - getting the author of the article - writing the author back to the page at a different path and then re-associating the article with that author, deleting the old content and sometimes deleting an empty page (some pages get merged). I had to do this for 50 or so pages. As NodeJS wants to do asyncronysly, everything got executed all at once and not in the order I specified. I had to re-write the functions, splitting the deletes into a separate script and re-think everything about how I was reading in the data and then writing it back in. If this was PHP or any other syncronys language - would be no problem. Then again, if I did this in PHP I'd have SQL and 3/4 of the script would be moot :) NoSQL document stores would really benefit from "some SQL" but now I'm off topic...
Jan Vladimir Mostert
Idea Incubator
Java:
20+ years of engineering, rock solid foundation, huge ecosystem of libraries (there's a well engineered library for everything that's been maintained for many years), the JVM which has an enormous amount of unit tests to make sure things stay stable, decent concurrency models, profiling tools which has stood the test of time, remote debugging, better IDEs (nothing beats IntelliJ ultimate) and the language is well designed with very few quirks whereas JS has many inconsistencies. Depending on your choice of framework / thread-model, you can either be faster than Node or much slower than node.
Using reactive-type thread models is already baked into the latest cutting edge Java frameworks, which outperforms Node by leaps and bounds but the rest will take a few years before they catch up, so Node will continue to benchmark faster than a lot of the frameworks until they all implement either Servlet 3.1+ or roll their own reactive style "threads".
Maintainability I've found is much easier in Java code-bases in general simply due to it being strongly typed.
Maven is awesome!
Node:
If you already know JS, the learning curve for Node is much much much smaller than Java, due to JS not being strongly typed, you can build things much faster, but you're missing out on the ecosystem, the JS ecosystem still has a long way to go before it'll be as mature and reliable as the Java ecosystem.
Node has a reactive style right out of the box which with Java unless you roll your own, use Servlet 3.1 or use VertX, your server will create a thread per process which is less than ideal. Getting push style notifications working via sockJS on Node is a lot easier than in Java, Spring makes it easier, but not everyone is using Spring.
NPM is an awesome package manager!