2012-01-03 19 views
8

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

+0

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

+0

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. –

Trả lời

10

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.

+0

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. –

-6

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.

+4

Đây là một ý tưởng tồi. Thay vào đó, hãy xem các câu trả lời khác. –

8

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.

+2

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). –

+0

Có thể nhận được thông báo phản hồi về sự kiện kết thúc không? –

+0

'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

3

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 
    })); 
+0

Đây là câu trả lời hiện đại và có lẽ đúng nhất cho ngày hôm nay. –

Các vấn đề liên quan