Trong đoạn code dưới đây tôi không thể hiểu tại sao req.pipe (res) không hoạt động, và chưa ném một lỗi. Một linh cảm nói với tôi đó là do hành vi asynch của nodejs, nhưng đây là một trường hợp rất đơn giản mà không cần gọi lại.NodeJS - Làm thế nào để dòng yêu cầu cơ thể mà không đệm
Tôi đang thiếu gì?
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);
Đây là curl:
➜ ldap-auth-gateway git:(master) ✗ curl -v -X POST --data "test.payload" --header "Cookie: token=12345678" --header "Content-Type:text/plain" localhost:9002
Dưới đây là kết xuất debug (xem cơ thể đã được tải lên):
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
Và các dịch vụ đáp ứng mà không lặp lại cơ thể yêu cầu:
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"
}
... và gỡ lỗi curl cuối cùng là
Body:
Connection #0 to host localhost left intact
Closing connection #0
Ngoài ra, khi tôi kiểm tra căng thẳng với thân yêu cầu lớn, tôi gặp lỗi EPIPE. Làm thế nào tôi có thể tránh điều này?
- CHỈNH SỬA: Qua thử và sai, tôi đã làm việc này và nó vẫn chỉ là vấn đề về thời gian. Mặc dù nó vẫn còn lạ, vì thời gian chờ làm cho tải trọng phải được trả lại, nhưng thời gian chờ không phải là minded. Nói cách khác cho dù tôi đặt thời gian chờ là 5 giây hoặc 500 giây, tải trọng được truyền lại đúng theo yêu cầu và kết nối bị chấm dứt.
Đây là chỉnh sửa:
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);
?
Lưu ý rằng bạn sẽ thấy rằng yêu cầu được gửi đến 9002. Đây là proxy ngược (nút đơn giản-http-proxy đến 8000, mục tiêu). Việc đưa mục tiêu trực tiếp mang lại kết quả tương tự. –