Node.js v7.0.0
The JavaScript language has improved a lot since node.js was released (Promises and soon async/await).  However, at this point NPM has a lot of libraries written in the old callback style and it seems even new libraries are still doing this.  There are libraries like bluebird and Q which can "promisify" a callback style library, but I think using these is a bad practice.  It's something that works most of the time, but sometimes breaks when the callback code isn't what the promisify function expected.  Also, the library writers are not writing the code with any guarantees that promisify will always work.  So even if it works now, it could break in the future.<p>The whole promisify is a good example of general node.js culture.  It's considered "good enough" and everyone just uses it.  However, anyone who has done software development in more solid languages would feel very uneasy using something like this.  It's not really the fault of the JS developers, the dynamic nature of the language offers no other choice.  For example, when Java added lambdas, since it has static typing it could consider a certain type of class (a single method class) as automatically a lambda.  This allowed full backwards compatibility with any old library that conformed to this (and many libraries such as Guava did use single method class as a kind of "ugly" lambda).<p>node.js has a convention for callbacks (function(err, result)), but unfortunately it's only a convention and there's no compiler to enforce it.  So automatic promisification is not possible.  That leads to the current situation.  There's all these new language features in JS, but everyone is still sticking to the "lowest common denominator" of callbacks.  There's no path forward for existing libraries.  The only way is a complete rewrite of libraries using the new Promise/async/await style.