Domanda

Ho un app node.js che voglio utilizzare per verificare se un determinato sito è attivo e restituire il codice di risposta corretta. Voglio essere in grado di catturare tutti gli errori che si presentano come il nome di dominio non sta risolvendo o la richiesta è timeout. Il problema è che questi errori è causa del nodo di merda. Sono nuovo di tutta questa metodologia di programmazione asincrona, quindi non sono sicuro dove mettere i miei try / dichiarazioni di cattura.

Ho una chiamata AJAX che va a qualcosa di simile / controllo / sito1. lato server che chiama una funzione che tenta di effettuare una connessione e poi restituire la statusCode. Si tratta di una funzione molto semplice, e ho avvolto ogni riga in un try / catch e non è mai cattura nulla. Eccolo:

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

Anche con ciascuna di queste linee avvolte in un try / catch, io ancora ottenere eccezioni non gestite fanno come EHOSTUNREACH e così via. Voglio essere in grado di catturare quelle e ritorno che alla chiamata AJAX.

Tutti i consigli su cosa da provare dopo?

È stato utile?

Soluzione

http.createClient è stato sconsigliato.

Ecco un breve esempio di come gestire gli errori utilizzando il nuovo 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();

Altri suggerimenti

I imbattuto in un'altra soluzione, mentre ero alla ricerca di un problema simile. http.Client emette un evento 'errore' se la connessione non può essere stabilita per qualsiasi motivo. Se si gestisce l'evento, allora non sarà generata l'eccezione:

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

Naturalmente, l'errore di connessione e la risposta alla richiesta di entrambi arrivano in modo asincrono, il che significa che semplicemente restituendo la richiesta non funziona. Invece, dovreste avvisare il chiamante dei risultati all'interno dei gestori di eventi.

Purtroppo, al momento non c'è modo di recuperare direttamente queste eccezioni, dal momento che tutte le cose che accade in modo asincrono in background.

Tutto si può fare è quello di catturare l'uncaughtException è da soli:

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

che in questo caso (porta preavviso 800) log:

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

Node.js è ancora in fase di sviluppo e non ci sarà certo un sacco di progressi nel prossimo paio di mesi, proprio ora concentrarsi sembrano essere sulla correzione di bug prestazioni per 3.xe rendere l'API in qualche modo stabile, perché dopo tutti Node.js è principalmente un server in modo throughput di questioni.

Puoi presentare una bug, però, ma essere messo in guardia gli arresti ecc avere la priorità più alta strada di caratteristiche, e la maggior parte delle nuove caratteristiche lo rendono in via richieste di pull forcella.

Anche per l'attuale tabella di marcia di Node.js guardare questo discorso da Ryan Dahl (del nodo Creatore):
http://developer.yahoo.com/yui/theater/video .php? v = yuiconf2010-Dahl

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top