Konkretnie, jak wspomniał Tomash, niektóre wyjątki są niełapalne i powodują natychmiastowy pad aplikacji(sic!).
Najlepsze jest to że do niedawna nie było sposobu żeby temu zapobiec. Jeden jedyny niezłapany wyjątek w którejś z bibliotek, kiedyś przy jakiejś okazji doprowadzi do wypierdzielenia aplikacji, i tak co kilka dni (albo godzin). Jako wisienka: nawet jak znajdziesz metodę która nie łapie wyjątku, nie ma szans na zbadanie ścieżki która doprowadziła do jej wywołania!
Problemów z samą platformą jest tony, platforma potrafi się wywalać co jakiś czas bez powodu.
Idziemy dalej.
Styl tworzenia oprogramowania jest absurdalny. Jeżeli platforma wymusza na tobie konkretne zachowania typu
if(err){ throw(err) }
na początku każdej funkcji to jest to smród. Analizowałem swój własny kod, ponad 20% mojego kodu to był boilerplate. Bezużyteczne komendy pozwalające np. na łapanie wątków z callbacków, jak tego nie zrobisz, to wołasz asynchroniczne czytanie pliku, plik rzuca wyjątek, a ty nie masz pojęcia z jakiego powodu plik był w ogóle ładowany.
Zobacz sobie jak wygląda moduł fs nie ma to jak superobiekt, i programowanie strukturalne.
Zresztą widać to po stackoverflow.com. Obejrzyj sobie tag node.js i zobacz ile ludzi ma problemy z najprostszymi rzeczami, obsługą wyjątków, obsługa plików.
Ludzie głowią się godzinami jak sprawdzić np który plik jest najnowszy. W ruby sprowadza się to do Dir["*"].map{|x| File.mtime(x)}.max
Teraz napisz mi to samo w node.js w trybie asynchronicznym Podpowiedź będziesz miał problem bo:
a) w node.js nie ma obsługi glob w bibliotece standardowej
b) nie ma wbudowanej obsługi synchronizacji, więc nie ma łatwego sposobu żeby zsynchronizować ze sobą x wątków.
Kod do zrobienia podobnego zadania (sprawdzenie czy najnowszy plik źródłowy jest nowszy od wyjściowego) rozciąga się w kompilatorze coffeescript na 9 linijek! (a i to tylko dlatego że w jednym miejscu użyli wywołania synchronicznego).
Możesz oczywiście użyć metody statSync no ale przecież w node.js wszystko ma być na callbackach prawda? no bo jak robisz sync, to blokujesz cała maszynę wirtualną.
Możesz oczywiście zainstalowac jedną z ponad 10 bibliotek do synchronizacji - każdą ze swoimi własnymi problemami i błędami. Możesz też doinstalować bibliotekę do globa, no ale po cholere się tak męczyć.
Co do dokumentacji - jeżeli myśleliście że stdlib ruby jest źle udokumentowany, to nie widzieliście jeszcze dokumentacji node.js. Niektóre parametry wejściowe/wyjściowe nie są w ogóle opisane i trzeba się domyślać bazując na wynikach man dla poleceń systemowych.
Na sam koniec - ludzie JAVASCRIPT, serio? Jest tysiące powodów dlaczego nikt nie lubi w tym programować. A teraz jeszcze programować w tym na serwerze? bez jaj.
Tak więc konkluzja: node.js jest dla masochistów, amatorów, i idiotów.
Polecam też:
http://teddziuba.com/2011/10/straight-talk-on-event-loops.html
i ciąg dalszy: http://teddziuba.com/2011/10/straight-talk-on-event-loops.html
PS. W odpowiedzi na pytanie kiedy należy stosować: NIGDY. Jak bardzo chcesz się paprawć w eventy to polecam EventMachine w Ruby.
Ewentualnie epoll w c.