do not throw errors from your asynchronous code (pass them to the callback instead)

The idea of `callback(error, data)` implies that an asynchronous code stays asynchronous even if an error happens (i.e. in that case an error is given to the callback).

Otherwise (i.e. If you throw an error) there's generally no `try…catch` block to catch that error (because the parent code moved on considerably after it called an async method) and the script “crashes” inevitably (with the `Uncaught exception` message).