Frage

Ich habe eine node.js app, dass ich möchte zu überprüfen, verwenden, wenn eine bestimmte Website ist und die richtige Antwortcode zurück. Ich möchte alle Fehler fangen können, die wie der Domain-Name nicht kommen wird die Lösung oder die Anforderung eines Timeout. Das Problem ist, dass diese Fehler Ursache Knoten Mist aus. Ich bin neu in diesem ganzen asynchrone Programmierung Methodik, also bin ich nicht sicher, wo meine try / catch-Anweisungen setzen.

Ich habe einen Ajax-Aufruf, der wie / Scheck / site1 etwas geht. Server-Seite, die eine Funktion aufruft, die versuchen, eine Verbindung herzustellen und dann den status zurückzukehren. Es ist eine sehr einfache Funktion, und ich habe jede Zeile in einer try / catch gewickelt und es fängt nie etwas. Hier ist sie:

function checkSite(url){
    var site = http.createClient(80, url);
    var request = site.request('GET', '/', {'host': url});
    request.end();
    return request;
  }

Auch bei jedem dieser umschlossene Zeilen in einem try / catch, ich will noch nicht abgefangene Ausnahmen wie EHOSTUNREACH bekommen und so weiter. Ich möchte in der Lage, das zu den Ajax-Aufruf dieser und Rückkehr zu fangen.

Alle Empfehlungen auf, was als nächstes zu versuchen?

War es hilfreich?

Lösung

http.createClient ist veraltet.

Hier ist ein kleines Beispiel dafür, wie Fehler behandeln den neuen http.request mit:

var http = require("http");

var options = {
    host : "www.example.com"
};

var request = http.request(options, function(req) {
    ...
});
request.on('error', function(err) {
    // Handle error
});

request.end();

Andere Tipps

stolperte ich über eine andere Lösung, während ich ein ähnliches Problem erforschte. http.Client sendet ein ‚Fehler‘ Ereignis, wenn eine Verbindung aus irgendeinem Grunde nicht hergestellt werden kann. Wenn Sie dieses Ereignis behandeln, dann wird die Ausnahme nicht geworfen werden:

var http = require('http');
var sys = require('sys');

function checkSite(url) {
    var site = http.createClient(80, url);
    site.on('error', function(err) {
        sys.debug('unable to connect to ' + url);
    });
    var request = site.request('GET', '/', {'host': url});
    request.end();
    request.on('response', function(res) {
        sys.debug('status code: ' + res.statusCode);
    });
}

checkSite("www.google.com");
checkSite("foo.bar.blrfl.org");

Natürlich ist die Verbindungsfehler und die Antwort auf die Anfrage beide kommen asynchron, was bedeutet, dass die Anforderung einfach Rückkehr wird nicht funktionieren. Stattdessen würden Sie den Anrufer der Ergebnisse innerhalb der Event-Handler benachrichtigen müssen.

Leider im Moment gibt es keine Möglichkeit, diese Ausnahmen direkt zu fangen, da alle Sachen asynchron im Hintergrund passiert.

Alles, was Sie tun können, ist die uncaughtException ist auf eigene Faust zu fangen:

var http = require('http');

function checkSite(url){
    var site = http.createClient(800, url);
    var request = site.request('GET', '/', {'host': url});
    request.end();
    return request;
}

process.on('uncaughtException', function (err) {
    console.log(err);
}); 

checkSite('http://127.0.0.1');

, die in diesem Fall (Hinweis Port 800) Protokolle:

{ message: 'ECONNREFUSED, Connection refused',
  stack: [Getter/Setter],
  errno: 111,
  syscall: 'connect' }

Node.js ist noch in der Entwicklung und es wird sicher ein großen Fortschritte in den nächsten paar Monaten, jetzt konzentrieren scheint auf Fixierleistung Bugs für 3.x zu sein und die API etwas stabiler zu machen, denn nach alle Node.js ist in erster Linie ein Server so Durchsatz Angelegenheiten.

Sie können einen Fehler aber Datei aber gewarnt sein Abstürze usw. haben Art und Weise eine höhere Priorität macht es als Funktionen und die meisten neuen Funktionen in über Gabel Pull-Anforderungen.

Auch für die aktuelle Roadmap von Node.js beobachten diesen Vortrag von Ryan Dahl (Node des Schöpfers):
http://developer.yahoo.com/yui/theater/video .php? v = yuiconf2010-dahl

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top