2014-09-24 40 views
12

Come faccio a verificare se esiste un URL senza estrarlo? Io uso il seguente codice, ma scarica l'intero file. Devo solo controllare che esista.node.js verifica se esiste un URL remoto

app.get('/api/v1/urlCheck/', function (req,res) { 
    var url=req.query['url']; 
    var request = require('request'); 
    request.get(url, {timeout: 30000, json:false}, function (error, result) { 
     res.send(result.body); 

    }); 

}); 

Apprezzare qualsiasi aiuto!

+2

È possibile eseguire una richiesta HEAD anziché una GET. Qualunque modulo tu stia usando lì, immagino che offrano un'interfaccia semplice per questo. –

risposta

24

Prova questa:

var http = require('http'), 
    options = {method: 'HEAD', host: 'stackoverflow.com', port: 80, path: '/'}, 
    req = http.request(options, function(r) { 
     console.log(JSON.stringify(r.headers)); 
    }); 
req.end(); 
+0

fantastico, grazie. – metalaureate

+3

opts! = Options;) –

9

Grazie! Qui è, incapsulato in una funzione (aggiornato il 5/30/17 con la richiedere all'esterno):

var http = require('http'), 
     url = require('url'); 

    exports.checkUrlExists = function (Url, callback) { 
     var options = { 
      method: 'HEAD', 
      host: url.parse(Url).host, 
      port: 80, 
      path: url.parse(Url).pathname 
     }; 
     var req = http.request(options, function (r) { 
      callback(r.statusCode== 200);}); 
     req.end(); 
    } 

E 'molto veloce (I ottenere circa 50 ms, ma dipenderà dalla vostra connessione e il velocità del server). Si noti che è anche abbastanza semplice, cioè non gestisce i reindirizzamenti molto bene ...

+1

Non si dovrebbe usare 'require' all'interno di un corpo di una funzione poiché è sincrono. – Westy92

+1

La risorsa o l'URL esistenti possono restituire stati diversi da 200 ed essere ancora validi –

2

'require' in funzioni è il modo sbagliato nel nodo. Seguito ES6 metodo supporta tutti gli stati http corrette e, naturalmente, l'errore recuperare se si ottiene 'host' cattivo come fff.kkk

checkUrlExists(host,cb) { 
    http.request({method:'HEAD',host,port:80,path: '/'}, (r) => { 
     cb(null, r.statusCode > 200 && r.statusCode < 400); 
    }).on('error', cb).end(); 
} 
+0

Non sono sicuro, ma questo sembra essere il modo migliore per controllare gli errori di collegamento !!! – peterb

5

Basta usare url-exists pacchetto NPM per verificare se esista o meno url

var urlExists = require('url-exists'); 

urlExists('https://www.google.com', function(err, exists) { 
    console.log(exists); // true 
}); 

urlExists('https://www.fakeurl.notreal', function(err, exists) { 
    console.log(exists); // false 
}); 
+1

Molto più pulito. Grazie per la condivisione! – Sebyddd

+0

Esiste un'opzione per usarlo con chiamata sincrona –

0

Utilizzando le altre risposte come riferimento, ecco una versione promisified che funziona anche con https URI (per nodo 6+):

const http = require('http'); 
const https = require('https'); 
const url = require('url'); 

const request = (opts = {}, cb) => { 
    const requester = opts.protocol === 'https:' ? https : http; 
    return requester.request(opts, cb); 
}; 

module.exports = target => new Promise((resolve, reject) => { 
    let uri; 

    try { 
    uri = url.parse(target); 
    } catch (err) { 
    reject(new Error(`Invalid url ${target}`)); 
    } 

    const options = { 
    method: 'HEAD', 
    host: uri.host, 
    protocol: uri.protocol, 
    port: uri.port, 
    path: uri.path, 
    timeout: 5 * 1000, 
    }; 

    const req = request(options, (res) => { 
    const { statusCode } = res; 

    if (statusCode >= 200 && statusCode < 300) { 
     resolve(target); 
    } else { 
     reject(new Error(`Url ${target} not found.`)); 
    } 
    }); 

    req.on('error', reject); 

    req.end(); 
}); 
0

Date un'occhiata al url-esiste pacchetto npm https://www.npmjs.com/package/url-exists

Impostazione:

$ npm install url-exists 

Uso:

const urlExists = require('url-exists'); 

urlExists('https://www.google.com', function(err, exists) { 
    console.log(exists); // true 
}); 

urlExists('https://www.fakeurl.notreal', function(err, exists) { 
    console.log(exists); // false 
}); 

È inoltre possibile promisify è di approfittare di attendono e async:

const util = require('util'); 
const urlExists = util.promisify(require('url-exists')); 

let isExists = await urlExists('https://www.google.com'); // true 
isExists = await urlExists('https://www.fakeurl.notreal'); // false 

Felice codifica!