Skip to main content

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

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 documentationor 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 !

Comments

Popular posts from this blog

Understand Angular’s forRoot and forChild

  forRoot   /   forChild   is a pattern for singleton services that most of us know from routing. Routing is actually the main use case for it and as it is not commonly used outside of it, I wouldn’t be surprised if most Angular developers haven’t given it a second thought. However, as the official Angular documentation puts it: “Understanding how  forRoot()  works to make sure a service is a singleton will inform your development at a deeper level.” So let’s go. Providers & Injectors Angular comes with a dependency injection (DI) mechanism. When a component depends on a service, you don’t manually create an instance of the service. You  inject  the service and the dependency injection system takes care of providing an instance. import { Component, OnInit } from '@angular/core'; import { TestService } from 'src/app/services/test.service'; @Component({ selector: 'app-test', templateUrl: './test.component.html', styleUrls: ['./test.compon...

How to use Ngx-Charts in Angular ?

Charts helps us to visualize large amount of data in an easy to understand and interactive way. This helps businesses to grow more by taking important decisions from the data. For example, e-commerce can have charts or reports for product sales, with various categories like product type, year, etc. In angular, we have various charting libraries to create charts.  Ngx-charts  is one of them. Check out the list of  best angular chart libraries .  In this article, we will see data visualization with ngx-charts and how to use ngx-charts in angular application ? We will see, How to install ngx-charts in angular ? Create a vertical bar chart Create a pie chart, advanced pie chart and pie chart grid Introduction ngx-charts  is an open-source and declarative charting framework for angular2+. It is maintained by  Swimlane . It is using Angular to render and animate the SVG elements with all of its binding and speed goodness and uses d3 for the excellent math functio...

How to solve Puppeteer TimeoutError: Navigation timeout of 30000 ms exceeded

During the automation of multiple tasks on my job and personal projects, i decided to move on  Puppeteer  instead of the old school PhantomJS. One of the most usual problems with pages that contain a lot of content, because of the ads, images etc. is the load time, an exception is thrown (specifically the TimeoutError) after a page takes more than 30000ms (30 seconds) to load totally. To solve this problem, you will have 2 options, either to increase this timeout in the configuration or remove it at all. Personally, i prefer to remove the limit as i know that the pages that i work with will end up loading someday. In this article, i'll explain you briefly 2 ways to bypass this limitation. A. Globally on the tab The option that i prefer, as i browse multiple pages in the same tab, is to remove the timeout limit on the tab that i use to browse. For example, to remove the limit you should add: await page . setDefaultNavigationTimeout ( 0 ) ;  COPY SNIPPET The setDefaultNav...