Di seguito vedremo come verificare se un dominio è disponibile per la registrazione con Node.js.

Possiamo usare il comando whois per ottenere questa informazione con il parametro -h per specificare un server WHOIS dove effettuare la richiesta.

La risposta del server WHOIS conterrà solo una determinata stringa nel caso in cui il dominio non è ancora stato registrato. Possiamo creare un nostro array di oggetti contenenti le informazioni dei vari server WHOIS. Ad esempio per i domini .it avremo:

{
    extension: '.it',
    server: 'whois.nic.it',
    response: 'AVAILABLE'
}

La stringa della proprietà response sarà diversa da server a server e la sua presenza o meno nella risposta indicherà se il dominio è disponibile per la registrazione.

Installiamo il modulo NPM validator per validare il formato dei nomi a dominio:

npm install validator --save

Creiamo una funzione helper che da un nome a dominio ne estragga l'estensione tenendo conto della doppia estensione.

const getExtension = domain => {
    const dotFirst = domain.indexOf('.');
    return domain.substring(dotFirst);
};

Ora creiamo la funzione per eseguire il comando whois dalla shell con i parametri richiesti.

const sendRequest = ({ host, domain }) => {
    const { exec } = require('child_process');
    return new Promise((resolve, reject) => {
        const cmd = `whois -h ${host} ${domain}`;
        exec(cmd, (err, stdout, stderr) => {
            if(err) {
                reject(err.message);
            }
            if(stderr) {
                reject(stderr);
            }

            resolve(stdout);
        });
    });
};

Implementiamo una classe che, dato un nome a dominio, ne verificherà la validità sintattica e la presenza dell'estensione nel nostro array di server WHOIS ed infine effettuerà la richiesta restituendo lo stato del dominio.

'use strict';

const validator = require('validator');
const data = require('../src/data');

class WhoisClient {
    constructor(domain) {
        this.domain = domain;
    }

    async request() {
        let response = {
            result: ''
        };
        if(!validator.isFQDN(this.domain)) {
            response.result = 'Invalid domain name.';
            return response;
        }

        const extension = getExtension(this.domain);

        const datum = data.find(d => {
           return d.extension === extension;
        });

        if(!datum) {
            response.result = 'Invalid domain extension.';
            return response;
        }

        try {
            const output = await sendRequest({
               host: datum.server,
               domain: this.domain
            });

            response.result = output.includes(datum.response) ? 'Available' : 'Not Available';

        } catch(err) {
            response.result = 'Error.';
        }

        return response;
    }
}

module.exports = WhoisClient;

Esempio d'uso:

'use strict';

const WhoisClient = require('./lib/WhoisClient');
const client = new WhoisClient('gabrieleromanato.com');

(async() => {
    console.log(await client.request());
})();