2016-03-26 4 views
0

Ist es möglich, Antworten von mehreren Anfragen auf HTTP-Server-Antwort zu streamen?nodejs- Request-Modul- Streaming mehrere Antworten von der Anfrage an http.ServerResponse

in Express.js, etwas wie-

router.get('/streamingApi',(req,res)=> { 
request('http://localhost:3000/first').pipe(res); //take 300 ms 
request('http://localhost:3000/second').pipe(res); //take 100 ms 
request('http://localhost:3000/third').pipe(res); // take 200 ms 
} 

Die Idee ist, den Strom zu Browser zurückzukehren, wie es kommt (wenn wir die Antwort für die zweite api erhalten, die die schnellste ist, strömen sie zum Browser, dann dritte api Antwort und dauern die Antwort der ersten API).

Aber wenn ich den obigen Code ausführen, nur die erste Antwort erhalten piped und dann schließt die Verbindung.

ist dies sogar mit Stream-Piping machbar? irgendwelche Vorschläge, um dies ohne Verwendung von socket.io zu beheben?

Antwort

0

Es ist nicht möglich, alle auf einmal zu streamen, andernfalls könnten Sie eine Antwort mit gemischten oder doppelten Daten haben.

Es gibt auch keine Möglichkeit, im Voraus zu wissen, welche Anfrage zuerst abgeschlossen wird, es sei denn, Sie haben Vorkenntnisse über die Leistung jedes Endpunkts. Ich nehme an, du könntest jedoch Anfragen an alle drei Endpunkte abfeuern und nur denjenigen streamen, der am schnellsten antwortet (die anderen zwei an diesem Punkt abbricht), aber das ist nicht unbedingt eine Garantie dafür, dass dieser Stream endet, bevor die anderen ihn haben.

+0

Danke für die Antwort. Ich brauche alle 3 Antworten, nicht nur die erste. aber nicht auf alle 3 Anfragen warten wollen, um zu beenden. – msreekm

+0

Ich verstehe nicht, was Sie dann erreichen wollen. Sie möchten alle 3 Antworten puffern und * dann * zurück zum Client senden? Wenn Sie alle 3 Antworten benötigen und nicht warten möchten, bis sie fertig sind, wie erwarten Sie, dass Sie alle an den Kunden liefern? – mscdex

+0

mscdex- das frage ich mich auch, ob es einen Weg gibt, es zu tun. . Eine Möglichkeit, die ich erreichen konnte, war die Verwendung von Websockets. aber Skalierung von WebSockets-Anwendung ist nicht so einfach. also ich versuche zu sehen, ob wir das mit regelmäßigen http-anrufen machen können. Danke für die Antwort. – msreekm