Node 7 and Promise Rejections – Please Handle them

Node.js 7.0.0 was released just last week, and the announcement dropped a bombshell. I’m guessing the following announcement might freak some people out:

DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

While the UnhandledPromiseRejectionWarning has been in node since 6.6.0, this deprecation warning is new — basically, it means you’ve rejected a promise in your code, but you are not handling it, and eventually, future of releases of Node.js will make your currently usable code stop being useable.

So let’s see a very simple example of how to trigger this:

note: these next few example will be using the node.js REPL

> Promise.reject();

If we run this in node 6.5 and below we might get something like this:

> Promise.reject()
Promise { <rejected> undefined }

If run in node 6.6 and above(this doesn’t include 7.0), we will see something similar:

> Promise.reject()
Promise { <rejected> undefined }
> (node:91599) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): undefined

Here we start to see the UnhandledPromiseRejectionWarning.

Now, if we run this in node 7.0, we get the deprecation warning:

> Promise.reject()
Promise { <rejected> undefined }

> (node:91721) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): undefined

(node:91721) DeprecationWarning: Unhandled promise rejections are deprecated.
In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

So lets see another example of this, but this time with “real” code:

function resolvePromise() {
  return rejectPromise();
}

function rejectPromise() {
  return Promise.reject();
}

resolvePromise().then(() => {
   console.log('resolved');
});

Here we have 2 functions that return promises, one resolves, the other rejects. We are calling the resolvePromise function and expecting it to resolve correctly, i mean, the name clearly states it resolves.

If we run this code, we will get the warnings from above, and “resolved” will not be output to the console.

In previous version of node below 6.6, when no warnings were output, it can be very confusing since no non-zero exit is returned.

Now this is not a one solution fixes all, but it works in this case, you can just add a .catch to the end of statement and you should be good. Our new code looks like this:

function resolvePromise() {
  return rejectPromise();
}

function rejectPromise() {
  return Promise.reject();
}

resolvePromise().then(() => {
  console.log('resolved');
}).catch((err) => {
  console.log('errored');
});

Now when this is run, you should see the errored result in the console.

While most of us are perfect programmers, this can happen from time to time. While running the test suite for Szero, I got these warnings — that’s why I decided to write and share this post.


Join the Red Hat Developer Program (it’s free) and get access to related cheat sheets, books, and product downloads.

 

Share
What did you think of this article?
-1+1 (No Ratings Yet)
Loading...

Leave a Reply