2016-01-21 13 views
5

node.js:Dlaczego ta podstawowa obsługa błędów Node.js nie działa?

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); 
}); 

Jeśli dodać https: // do nazwy domeny google następnie uzyskać kod statusu 200, jak oczekiwano. Oczekuję, że błąd zostanie wychwycony i komunikat o błędzie podobny do "connect ECONNREFUSED" zostanie wydrukowany na konsoli terminala. Zamiast tego drukuje stos śledzenia do terminala.

+1

drukowania Spróbuj tylko * błąd *, a nie * Error.message * –

+1

I dlaczego połączenie powinno być odrzucone d? – adeneo

+0

Używaj protokołu 'https' jak' https: // google.com' zamiast 'google.com'. – Maxali

Odpowiedz

9

Jeśli spojrzeć na source for https.get(), można zobaczyć, że jeśli parsowania adresu URL nie powiedzie (co to będzie, gdy tylko przekazać go "google.com/" ponieważ nie jest to prawidłowy adres URL), to rzuca się synchronicznie:

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); 
}; 

Tak więc, jeśli chcesz złapać ten konkretny rodzaj błędu, trzeba try/catch wokół wywołanie https.get() tak:

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); 
}