NodeJS - Wie stream beantragen Körper, ohne Pufferung
In dem code unten kann ich nicht herausfinden, warum req.Rohr(res) nicht funktioniert, und noch nicht einen Fehler auslösen, entweder. Eine Ahnung sagt mir, es ist wegen nodejs' asynch Verhalten, aber dies ist ein sehr einfacher Fall, ohne einen Rückruf.
Was bin ich?
http.createServer(function (req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.write('Echo service: \nUrl: ' + req.url);
res.write('\nHeaders:\n' + JSON.stringify(req.headers, true, 2));
res.write('\nBody:\n');
req.pipe(res); //does not work
res.end();
}).listen(8000);
Hier ist die LOCKE:
➜ ldap-auth-gateway git:(master) ✗ curl -v -X POST --data "test.payload" --header "Cookie: token=12345678" --header "Content-Type:text/plain" localhost:9002
Hier ist die debug-Ausgabe (sehen, dass Körper hochgeladen wurde):
About to connect() to localhost port 9002 (#0)
Trying 127.0.0.1...
connected
Connected to localhost (127.0.0.1) port 9002 (#0)
POST / HTTP/1.1
User-Agent: curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8x zlib/1.2.5
Host: localhost:9002
Accept: */*
Cookie: token=12345678
Content-Type:text/plain
Content-Length: 243360
Expect: 100-continue
HTTP/1.1 100 Continue
HTTP/1.1 200 OK
Content-Type: text/plain
Date: Sun, 04 Aug 2013 17:12:39 GMT
Connection: keep-alive
Transfer-Encoding: chunked
Und der service antwortet, ohne echo der request-body:
Echo service:
Url: /
Headers:
{
"user-agent": "curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8x zlib/1.2.5",
"host": "localhost:9002",
"accept": "*/*",
"cookie": "token=12345678",
"content-type": "text/plain",
"content-length": "243360",
"expect": "100-continue"
}
... und der Letzte curl debug ist
Body:
Connection #0 to host localhost left intact
Closing connection #0
Außerdem, wenn ich stress test mit der großen bitte Körper, ich erhalte eine Fehler EPIPE. Wie kann ich diese vermeiden?
-- EDIT: Durch Versuch und Irrtum habe ich diese zu arbeiten, und es immer noch Punkte, um ein timing-Problem. Aber es ist trotzdem seltsam, da der timeout bewirkt, dass die Nutzlast zurückgegeben werden, aber die timeout-Dauer nicht gemerkt. In anderen Worten, ob ich den timeout auf 5 Sekunden oder 500 Sekunden, die Nutzlast ordnungsgemäß geleitet wieder auf den Antrag und die Verbindung ist beendet.
Hier der edit:
http.createServer(function (req, res) {
try {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.write('Echo service: ' + req.url + '\n' + JSON.stringify(req.headers, true, 2));
res.write('\nBody:"\n');
req.pipe(res);
} catch(ex) {
console.log(ex);
//how to change response code to error here? since headers have already been written?
} finally {
setTimeout((function() {
res.end();
}), 500000);
}
}).listen(TARGET_SERVER.port);
?
- Hinweis: Sie werden sehen, dass eine Anforderung vorgenommen wird, um 9002. Dies ist ein reverse-proxy (einfach Knoten-http-proxy zu 8000, das Ziel). Das Ziel zu treffen direkt ergibt die gleichen Ergebnisse.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Rohr req zu res. Erf lesbar ist stream und die Antwort ist eine beschreibbare stream.Sollte es funktionieren
Also erstmal, es sieht aus wie Ihre curl deaktiviert ist, werden die Dateinamen der gesendeten Daten vorangestellt werden soll eine @ wie hier gezeigt. Sie hatte nur sein posting die ansonsten der Dateiname.
Abgesehen davon, Chandu ist richtig, wenn er sagt, dass der Aufruf zu
res.end()
ist das problem hier.Da IO wird asynchron im Knoten, wenn Sie den
.pipe
Befehl gibt die Kontrolle sofort wieder an den aktuellen Kontext, während das Rohr im hintergrund arbeitet. Beim nächsten Aufrufres.end()
Sie den stream schließen, Prävention keine Daten mehr geschrieben werden.Die Lösung hier zu lassen
.pipe
Ende der stream selbst, das ist der Standard.Würde ich mir vorstellen, dass das timing ins Spiel kam, weil auf verschiedenen Rechnern und verschiedenen Daten-Größen, die asynchrone IO könnte theoretisch fertig (fast-IO von kleinen dataset) vor dem end-Ereignis auf den schreibbaren stream ist vollständig bearbeitet.
Ich würde empfehlen, in diesem blog-post für etwas mehr Kontext.
res.write
s nach dem Aufruf vonend
und Sie auch nicht still. Sie werfen sollten erneut Fehler:docs. Interessant..!