Question

J'ai une application Node.js que je veux utiliser pour vérifier si un site particulier est en place et le retour le code de réponse appropriée. Je veux être en mesure de détecter les erreurs qui se présentent comme le nom de domaine ne résout pas ou si la demande est hors délai. Le problème est que ces erreurs provoquent nœud à merde. Je suis nouveau à toute cette méthode de programmation asynchrone, donc je ne sais pas où mettre mes try / déclarations de captures.

J'ai un appel ajax qui va à quelque chose comme / chèque / site1. côté serveur qui appelle une fonction qui tente d'établir une connexion, puis le retour statusCode. Il est une fonction très simple, et je l'ai enveloppé chaque ligne dans un try / catch et il attrape jamais rien. Ici, il est:

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

Même avec chacune de ces lignes enveloppées dans un try / catch, je vais quand même obtenir des exceptions non rattrapées comme EHOSTUNREACH et ainsi de suite. Je veux être en mesure d'attraper ceux-ci et que le retour à l'appel ajax.

Les recommandations sur ce qu'il faut essayer la prochaine?

Était-ce utile?

La solution

http.createClient a été désapprouvée.

Voici un exemple rapide de la façon de gérer les erreurs en utilisant la nouvelle http.request:

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

Autres conseils

Je suis tombé sur une autre solution alors que je faisais des recherches sur un problème similaire. http.Client émet un événement « d'erreur » si une connexion ne peut être établie pour une raison quelconque. Si vous gérez cet événement alors l'exception ne sera pas jeté:

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

Bien sûr, l'erreur de connexion et la réponse à la demande les deux arrivent de façon asynchrone, ce qui signifie que le simple fait de retourner la demande ne fonctionnera pas. Au lieu de cela, vous auriez à informer l'appelant des résultats à l'intérieur des gestionnaires d'événements.

Malheureusement, au moment il n'y a aucun moyen de rattraper ces exceptions directement, puisque toutes les choses qui se passe de manière asynchrone en arrière-plan.

Tout ce que vous pouvez faire est de prendre le uncaughtException est sur votre propre:

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

dans ce cas (port 800 avis) journaux:

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

Node.js est encore en cours de développement et il y aura sûr être beaucoup de progrès dans les deux prochains mois, se concentrer en ce moment semblent être sur la correction des bugs de performance pour 3.x et rendre l'API un peu stable, car après tous Node.js est principalement un serveur pour le débit des questions.

Vous pouvez fichier un bug bien, mais attention les accidents, etc. ont la priorité façon plus que les caractéristiques, et la plupart des nouvelles fonctionnalités via le faire des demandes de traction de la fourche.

En outre pour la feuille de route actuelle de Node.js regarder ce discours par Ryan Dahl (créateur du nœud):
http://developer.yahoo.com/yui/theater/video .php? v = yuiconf2010- dahl

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top