Disclaimer: All the things I am going to mention are my personal opinions and I may have used some strong language to express my views. You can argue all day about how the things I have mentioned are invalid or are based on personal opinion, but the fact is they are my personal opinions and everyone has rights to think their own way.
1) Callback hell is real: If you are familiar with Node.js, I am pretty sure you are familiar with callback hell or have at least heard about it. Node.js is built to work asynchronously which means unlike traditional programming languages where you have to wait for one task to finish to start the next one, you pass callbacks (which are basically just functions) that will be executed when the required task is done. If you are new and have never used Node.js this might be confusing to you, but if you have used Node.js then you most likely know how difficult it can be to manage callbacks. Most of the time, you end up with a tree of callbacks. This makes it extremely easy to get lost in the code and makes code reviewing difficult. There are ways to fight callback hell, and http://callbackhell.com/ does a good job of explaining them.
2) Debugging is a bitch: This is mostly a personal opinion, but I found Node.js hard to debug than other languages I have used. It is really easy to get lost in the code and even debugging simple things take long time.
5) The packages aren’t that good: I love npm. That is probably the thing that i love the most about Node.js.Npm makes it extremely easy to install third party packages that you can use from/with the app you are building. But its not all rainbows and cookies with npm, what I found is almost half of the packages I find are either abandoned by their maintainers or are not well documented (heck, the biggest websocket library socket.io has a horrible documentation) or are coded poorly. There are some really good packages that are frequently updated and maintained, but having to search through packages to find the right thing gets frustrating.