2016-03-29 13 views
1

Ich bin etwas Neues zu NodeJS, und den Strom I verwendete Express und Request (https://github.com/request/request) meine App Anfrage weiterleiten REST-API-Server, Strom meines Code unten ändern:Wie NodeJS Anfrage Stream-Antwort

app.use('/rest/*', function(req, res) { 
    req.pipe(request('http://ipaddress/api')).pipe(res); 
}); 

Dieser Code funktioniert, wenn der REST-API-Server in Ordnung ist, aber wenn der Rest-API-Server ausfällt, geht meine Nodejs-App ebenfalls aus, weil der Anforderungsstream fehlschlägt und der Fehler nicht von meiner App abgefangen wird. überprüfte ich die Anfrage Github Seite, in einer anderen liefert den Strom Fehler zu behandeln, wie

app.use('/rest/*', function(req, res) { 
    req.pipe(request('http://ipaddress/api').on('error', function(err) { 
     console.log(err); 
    })).pipe(res); 
}); 

dies nur den Fehler anmelden und meine NodeJS App abstürzt zu verhindern, aber ich möchte die Antwort ändern, wenn ein Fehler aufgetreten, so dass die geänderte Reaktion kann bis zum endgültigen einem verrohrt werden, zum Beispiel, was ich will in Pseudo-Code tun:

app.use('/rest/*', function(req, res) { 
    req.pipe(request('http://ipaddress/api').on('error', function(err) { 
     console.log(err); 
     // what I want to do in pseudocode 
     response.statusCode = 500; 
     response.json = { 
      reason: err.errno 
     }; 
    })).pipe(res); 
}); 

gibt es Möglichkeiten, um meine Probleme zu lösen? Danke für irgendwelche Ideen!

+1

, das mit nur einer einzigen Anfrage nicht möglich sein könnte, da die Header bereits von der Zeit gesendet wurden die Fehler wahrscheinlich auftritt. Statt dessen sollten Sie eine HEAD-Anfrage vom Node-Server an den api-Server senden, um zu prüfen, ob sie online ist. Wenn das klappt, gehen Sie voran und leiten Sie die API-Anfrage an den Client weiter. Andernfalls können Sie die gewünschte Antwort an den Client senden. –

Antwort

0

Nicht getestet, aber konnten Sie den Fehler an Middleware zurückgeben, um die Antwort zu behandeln?

app.use('/rest/*', function(req, res, next) { 
    req.pipe(request('http://ipaddress/api').on('error', function(err) { 
     return next(err) 
    })).pipe(res); 
}); 

wie so behandelter

// Exception handling 
app.use(function (error, req, res, next) { 
    console.log(error); 
    res.status(500).send(JSON.stringify(error));  
    next(); 
}); 
+0

Vielen Dank, es funktioniert! Meine einzige Frage ist next() -Methode in der Ausnahmebehandlung Methode, ich habe versucht, die nächste() -Methode Aufruf, es funktioniert auch. Können Sie mir sagen, warum next() hier verwendet? – Bill

+0

Nur wirklich in der Ausnahmebehandlung verwendet, wenn Sie weitere (Middleware-) Aktionen ausführen müssen - möglicherweise haben Sie eine Protokollfunktion zum Beispiel – ossie

+0

Vielen Dank !!! – Bill