Tôi đang sử dụng node.js và express để xử lý các yêu cầu và phản hồi HTTP. Bằng cách sử dụng sự kiện http.ServerRequest
, tôi có thể thêm một móc vào và ghi lại các yêu cầu HTTP. Có vẻ như không phải là một sự kiện tương tự cho http.ServerResponse
và tôi tự hỏi làm thế nào để đăng nhập tất cả các phản ứng HTTP với một đoạn mã mà máy chủ của tôi gửi?Thêm móc để đăng nhập toàn cục tất cả các phản hồi HTTP nút trong node.js/express
Trả lời
Tôi đã tạo một gói làm một việc như vậy, ngoài nhu cầu tương tự. Kiểm tra express-request-logger
Trái tim của chương trình là như thế này, nó có chứa một số mã thêm, do đó bạn có thể có bản đồ giá trị chính của bạn dữ liệu sẽ được ghi lại theo yêu cầu:
// Save the real end that we will wrap
var rEnd = res.end;
// To track response time
req._rlStartTime = new Date();
// Proxy the real end function
res.end = function(chunk, encoding) {
// Do the work expected
res.end = rEnd;
res.end(chunk, encoding);
// And do the work we want now (logging!)
// Save a few more variables that we can only get at the end
req.kvLog.status = res.statusCode;
req.kvLog.response_time = (new Date() - req._rlStartTime);
// Send the log off to winston
var level = req.kvLog._rlLevel;
delete req.kvLog._rlLevel;
logger.log(level, '', req.kvLog);
};
Đoạn mã trên chạy như phần mềm trung gian thể hiện. Hãy xem mã, và nếu bạn có thêm câu hỏi, hãy liên lạc với tôi ở đây hoặc github.
Trong các phiên bản hiện tại của Node.js, 'res' sẽ tạo ra một sự kiện' "kết thúc mà bạn có thể sử dụng thay vì proxy phương thức kết thúc. –
Nếu bạn đang sử dụng tốc hành res.send() cho tất cả các câu trả lời, và bạn không nhớ chèn mã vào các mô-đun nhanh, bạn có thể chèn vào
.../node_modules/nhanh/lib/response.js:
43 res.send = function(body, headers, status){
44 console.log("\n...your log text here..." + body);
45 // allow status as second arg
46 if ('number' == typeof headers) {
47 status = headers,
48 headers = null;
49 }
Tôi không nghĩ bạn có thể nghe sự kiện không có lỗi - "đóng" dường như không kích hoạt khi res.send() ;. Tôi đoán đó là bởi vì send() luôn được gọi ở đâu đó trong mã của bạn.
Đây là một ý tưởng tồi. Thay vào đó, hãy xem các câu trả lời khác. –
Nó không còn cần thiết để monkeypatch, miễn là có một sự kiện kết thúc phát ra trên end() function từ node.js 0.8.12.
Trên thực tế, nó ban đầu được công bố như cuối trong 0.8.8 (kiểm tra cũng this) nhưng it broke writable streams' duplexes, vì vậy nó được đổi tên để kết thúc.
Tôi đã kiểm tra trong Node 0.8.14 và 0.8.23 và 'end' được phát ra, không phải' kết thúc'. Các cam kết bạn đã liên kết được bao gồm trong 0.9/0.10 chi nhánh (hiện đang được hiển thị bởi GH bên dưới thông báo cam kết từ một vài tuần trước). –
Có thể nhận được thông báo phản hồi về sự kiện kết thúc không? –
'end' dường như cũng làm việc cho tôi, trong khi' kết thúc' thì không. Tôi bối rối! – JoeRocc
Nếu bạn chỉ muốn đăng nhập (yêu cầu và/hoặc câu trả lời), hãy xem express-winston. Unlike morgan, nó thậm chí có thể đăng nhập cơ thể yêu cầu/phản hồi.
Ví dụ trong coffeescript:
expressWinston.requestWhitelist.push('body')
expressWinston.responseWhitelist.push('body')
app.use(expressWinston.logger({
transports: [
new winston.transports.Console({
json: true,
colorize: true
})
],
meta: true, // optional: control whether you want to log the meta data about the request (default to true)
msg: "HTTP {{req.method}} {{req.url}}", // optional: customize the default logging message. E.g. "{{res.statusCode}} {{req.method}} {{res.responseTime}}ms {{req.url}}"
expressFormat: true, // Use the default Express/morgan request formatting, with the same colors. Enabling this will override any msg and colorStatus if true. Will only output colors on transports with colorize set to true
colorStatus: true, // Color the status code, using the Express/morgan color palette (default green, 3XX cyan, 4XX yellow, 5XX red). Will not be recognized if expressFormat is true
ignoreRoute: function (req, res) { return false; } // optional: allows to skip some log messages based on request and/or response
}));
Đây là câu trả lời hiện đại và có lẽ đúng nhất cho ngày hôm nay. –
- 1. Đăng nhập jax-ws http yêu cầu và phản hồi
- 2. Cách đăng nhập tất cả tiêu đề yêu cầu/phản hồi trong Tomcat 7
- 3. Các tiêu đề HTTP thích hợp cho thành công đăng nhập/phản hồi không thành công?
- 4. Tất cả các yêu cầu nhận lỗi HTTP 401.2 - Phản hồi trái phép
- 5. Vô hiệu hóa tất cả nội dung phản hồi lỗi HTTP mặc định trong Tomcat
- 6. nút đăng nhập google google và nút đăng nhập facebook trông hoàn toàn khác nhau
- 7. Tạo phản hồi HTTP trong Ruby
- 8. Java/Tomcat độc lập, cách đăng nhập/truy cập tất cả các yêu cầu HTTP GET
- 9. Hacking Django Admin, móc để đăng nhập/đăng xuất
- 10. Đăng nhập tất cả các truy vấn trong mysql
- 11. Java: Nhận phản hồi HTTP nhiều phần
- 12. Có thể đăng nhập tất cả các tiêu đề yêu cầu HTTP bằng Apache không?
- 13. Grails - thêm tiêu đề cho tất cả các phản ứng
- 14. Tại sao ASP.NET framework thêm tiêu đề HTTP 'X-Powered-By: ASP.NET' trong các phản hồi?
- 15. Làm cách nào để xử lý các phản hồi http đa phần trong Ruby Net: HTTP?
- 16. Phản hồi HTTP 500 với Thân máy?
- 17. Trường Content-MD5 trong phản hồi HTTP phổ quát?
- 18. Cách đăng nhập bằng http dây trong Play 2
- 19. Cách đọc luồng phản hồi trước khi phản hồi Http hoàn thành
- 20. Phản hồi HTTP POST vào WebView trong android
- 21. Làm cách nào để đăng nhập phản hồi trong Spring RestTemplate?
- 22. Cách bắt tất cả lưu lượng HTTP (proxy cục bộ)
- 23. Giải nén phản hồi http được gzipped
- 24. Tên yêu cầu HTTP + Phản hồi
- 25. Yêu cầu và phản hồi của máy khách đăng nhập trục2
- 26. IIS ghi đè văn bản phản hồi HTTP khi trạng thái phản hồi HTTP được đặt là 400
- 27. Truyền tệp đến phản hồi HTTP trong giá treo
- 28. render_to_response với tiêu đề phản hồi HTTP
- 29. sử dụng phản hồi http cách lưu các tệp pdf
- 30. Đăng nhập an toàn
Không có cách nào để làm điều này. '" request "' được phát ra bởi 'HttpServer', thể hiện mở rộng. Cách dễ nhất là ghi đè '.send' hoặc' .end' bằng proxy đăng nhập mỏng. – Raynos
Cảm ơn, tôi đã kết thúc việc vá lỗi cho các phương thức http.ServerResponse - nó hoạt động rất tốt. –