How to check if there is an active internet connection in Node.js

How to check if there is an active internet connection in Node.js

Although the probabilities that your user does something important on your system, an action that couldn't be easily repeated, exactly on the moment where the internet stops working is pretty low, but it happens. In this moment your user would immediately blame on your system (and more if you didn't designed something to create a temporal backup of the information on the browser). On those cases, it's pretty important to check when there's an active connection before doing something important, just to prevent a bad time.

In this article we'll show you how to check if there's an active internet connection in Node.js using 2 open source modules.

A. Using internetAvailable module

Internet Available is an useful module to verify if there's an active internet connection with Node.js easily. To install this module in your project, execute the following command on your terminal:

npm install internet-available

This module has been written by Our Code World. This library relies on the dns-socket module used to resolve a DNS address from a domain. But, why use an extra module if Node.js already provides a Look Up DNS address method by default? Great question ! You are right, Node.js provides already a method that allow you to achieve this, however it doesn't provide any way to limit the execution time of the script. Therefore, we use this extra module that makes everything easier and it does it really well. For more information check the documentation or visit the official repository at Github here.

To check if there's an available internet connection with this module, you can do it quickly using the following code:

var internetAvailable = require("internet-available");

internetAvailable().then(function(){
    console.log("Internet available");
}).catch(function(){
    console.log("No internet");
});

As you can see it's pretty easy and functional. In case you need to, it can be customized to set a maximum execution time for the verification and a total of attempt that can be made, in case that the task takes more than needed:

var internetAvailable = require("internet-available");

// Set a timeout and a limit of attempts to check for connection
internetAvailable({
    timeout: 4000,
    retries: 10,
}).then(function(){
    console.log("Internet available");
}).catch(function(){
    console.log("No internet");
});

If the timeout period expires, it means that there isn't an available connection.

As previously mentioned, internetAvailable resolves a DNS address from a domain, namely google.com. If you don't want to use this domain for the verification, you can simply change it in the settings. The following example shows how to use the ourcodeworld.com domain instead of the google domain. The host and port can be changed, however we'll use the default ones:

var internetAvailable = require("internet-available");

// Make it with a different verification address
internetAvailable({
    domainName: "ourcodeworld.com",
    port: 53,
    host: '8.8.8.8'
}).then(() => {
    console.log("Internet available");
}).catch(() => {
    console.log("No internet");
});

Alternatively, if there's something special with the domain you want to use, you can change the DNS port of verification and the host address as it uses by default the Google Public DNS.

B. Using isOnline module

isOnline is a module that , unlike internetAvailable, works in Node.js and the browser (with browserify/webpack) and allows you to verify if there's an active internet connection. In the browser you have navigator.onLine, but it's useless as it only tells you if there's a local connection, and not whether the internet is accessible.

To install this module in your project, execute the following command on the terminal:

npm install is-online

This module execute some requests to different free services, all of them run in parallel:

  • Retrieve icanhazip.com via HTTPS
  • Query myip.opendns.com on OpenDNS (Node.js only)
  • Retrieve Apple's Captive Portal test page (Node.js only)

When any of them succeed, the returned Promise is resolved to true and therefore we can deduce that there's an internet connection. For more information about this library, please visit the official repository at Github here.

To check if there's internet with this module, use the following code (in the browser and with Node.js):

const isOnline = require('is-online');
 
isOnline().then(online => {
    if(online){
        console.log("We have internet");
    }else{
        console.log("Houston we have a problem");
    }
});

This library allows you to set a timeout in the same way the previous library does on its options. Besides, you can choose which Internet Protocol version to use. This is an advanced option that is usually not neccessary to be set, but it can prove useful to specifically assert IPv6 connectivity:

const isOnline = require('is-online');
 
isOnline({
    // Break on 5 seconds
    timeout: 5000,
    // v4 or v6
    version: "v4"
}).then(online => {
    if(online){
        console.log("We have internet");
    }else{
        console.log("Houston we have a problem");
    }
});

Happy coding !

Become a more social person