2016-01-21 4 views
5

Node.js:Perché questa semplice gestione degli errori di Node.js non funziona?

var https = require("https"); 


var request = https.get("google.com/", function(response) { 
    console.log(response.statusCode); 
}); 

request.on("error", function(error) { 
     console.log(error.message); 
}); 

Se aggiungo https: // al nome di dominio di Google tanto sono il codice di stato 200 come previsto. Come è, mi aspetterei che l'errore venga catturato e un messaggio di errore simile a "connect ECONNREFUSED" venga stampato sulla console del terminale. Invece stampa lo stacktrace sul terminale.

+1

stampa provare solo * errore *, non * Error.message * –

+1

E perché la connessione deve essere rifiutata d? – adeneo

+0

Usa il protocollo 'https' come' https: // google.com' invece di 'google.com'. – Maxali

risposta

9

Se si guarda al source for https.get(), si può vedere che se l'analisi dell'URL fallisce (che sarà quando si passa solo "google.com/" dal momento che non è un URL valido), poi si getta in modo sincrono:

exports.get = function(options, cb) { 
    var req = exports.request(options, cb); 
    req.end(); 
    return req; 
}; 

exports.request = function(options, cb) { 
    if (typeof options === 'string') { 
    options = url.parse(options); 
    if (!options.hostname) { 
     throw new Error('Unable to determine the domain name'); 
    } 
    } else { 
    options = util._extend({}, options); 
    } 
    options._defaultAgent = globalAgent; 
    return http.request(options, cb); 
}; 

Quindi, se si vuole cogliere quel particolare tipo di errore, è necessario un try/catch intorno al vostro chiamata a https.get() in questo modo:

var https = require("https"); 

try { 
    var request = https.get("google.com/", function(response) { 
     console.log(response.statusCode); 
    }).on("error", function(error) { 
     console.log(error.message); 
    }); 
} catch(e) { 
    console.log(e); 
}