1

I want to run a node app that would check multiple websites and responds with the proper status code. I am using the 'request' module of Node itself.

The code I have is:

const request = require('request')

function getStatus() {
    request('https://www.google.com', function(error, response, body) {

        result = response.statusCode;

        if(!error && response.statusCode == 200) {
            document.write("The Site Is Up");
            console.log(result);
        } else {
            console.log("The Site Is Down");
        }
    });
}

This works fine for one website. But, I want to know how can I run the same function for multiple sites? For example, the url should be fed from an Array of urls.

If I have an array of urls such as:

var urls = ["https://www.google.com", "https://www.yahoo.com"];

How can I feed these individual urls to the request function? and get results for each site?

1 Answers1

3

You can do this with a list of promises, should be easy enough to do:

const request = require('request')

const urlList = ["https://www.google.com", "https://www.amazon.com"];

function getStatus(url) {
    return new Promise((resolve, reject) => {
        request(url, function(error, response, body) {
            resolve({site: url, status: (!error && response.statusCode == 200) ? "OK": "Down: " + error.message});
        });
    })   
}

let promiseList = urlList.map(url => getStatus(url));

Promise.all(promiseList).then(resultList => {
    resultList.forEach(result => console.log("Result: ", result));
});

You can also us the request-promise-native library for a nicer API:

    const request = require('request')
    const rp = require('request-promise-native')

    const urlList = ["https://www.google.com", "https://www.amazon.com", "https://doesnotexist.none", "https://wikipedia.org"];

    function getStatusRp(url) {
        return rp({uri: url, resolveWithFullResponse: true }).then((response) => {
            return { site: url, status: response.statusCode === 200 ? "OK": "Down"};
        }, (err) => {
            return { site: url, status: "Down: " + err.message};
        });
    }

    let promiseList = urlList.map(url => getStatusRp(url));

    Promise.all(promiseList).then(resultList => {
        resultList.forEach(result => console.log("Result: ", result));
    });
Terry Lennox
  • 29,471
  • 5
  • 28
  • 40
  • 1
    Is it also possible to run this function inside a cron job to periodically run for example every 30 minutes? – Zaki Sediqyar Mar 07 '19 at 01:04
  • Yes, it sure is @ZakiSediqyar. There's an excellent library, [node-cron](https://www.npmjs.com/package/node-cron) that can do this! – Terry Lennox Mar 07 '19 at 08:06
  • Thank you for the feedback, Terry. However, I have one more question. I have created a CRUD app with node and mongodb using mongoose, I store the website name and url. I want the app to continuously run the REQUEST module and get a response.StatusCode of the urls. I also want to parse that response into front-end using handlebars. I can do the front end part, I just cant seem to get the mongo query's return object to feed the function's url param. – Zaki Sediqyar Apr 21 '19 at 05:44
  • I'd suggest creating a separate Stack Overflow question for that! – Terry Lennox Apr 21 '19 at 08:36