2012-03-27 26 views
25

Tôi muốn có chức năng phần mềm trung gian để sửa đổi nội dung phản hồi.Kết nối hoặc phần mềm trung gian Express để sửa đổi phản hồi.body

Đây là dành cho máy chủ tốc hành.

Cái gì như:

function modify(req, res, next){ 
    res.on('send', function(){ 
    res.body = res.body + "modified" 
    }); 

    next(); 
} 

express.use(modify); 

Tôi không hiểu những gì sự kiện để lắng nghe. Bất kỳ trợ giúp hoặc tài liệu nào sẽ được đánh giá cao.

Trả lời

17

Bạn không cần nghe bất kỳ sự kiện nào. Chỉ cần làm cho nó

function modify(req, res, next){ 
    res.body = res.body + "modified"; 

    next(); 
} 

use nó sau khi bạn use router. Bằng cách này sau khi tất cả các tuyến đường của bạn đã thực thi, bạn có thể sửa đổi phần thân

+5

Tôi đang cố gắng sử dụng phần mềm trung gian của mình sau bộ định tuyến, nhưng dường như nó không được kích hoạt. Nó chỉ được kích hoạt nếu tôi sử dụng nó trước khi app.router. Tôi đang sử dụng nó insite khối app.configure, nếu điều đó làm cho bất kỳ sự khác biệt. – ragulka

+3

Hãy chắc chắn rằng bạn đang gọi 'next' trong các tuyến đường của bạn, nếu không Express sẽ không thực hiện bất kỳ phần mềm trung gian nào sau tuyến đường đó –

+6

Bạn có một số câu trả lời được cập nhật cho Express 4 không? – gustavohenke

15

Tôi tin rằng OP thực sự muốn sửa đổi luồng phản hồi khi phần mềm trung gian đã xử lý yêu cầu. Nhìn vào việc thực hiện phần mềm trung gian được thực hiện theo số Compress đi kèm để biết ví dụ về cách thực hiện điều này. Kết nối khỉ vá các nguyên mẫu ServerResponse để phát ra sự kiện header khi gọi writeHead, nhưng trước khi nó được hoàn thành.

3

Ghi đè phương thức write của phản hồi dường như hoạt động với tôi bằng Express 4. Điều này cho phép sửa đổi nội dung của phản hồi ngay cả khi đó là luồng.

app.use(function (req, res, next) { 
    var write = res.write; 
    res.write = function (chunk) { 
    if (~res.getHeader('Content-Type').indexOf('text/html')) { 
     chunk instanceof Buffer && (chunk = chunk.toString()); 
     chunk = chunk.replace(/(<\/body>)/, "<script>alert('hi')</script>\n\n$1"); 
     res.setHeader('Content-Length', chunk.length); 
    } 
    write.apply(this, arguments); 
    }; 
    next(); 
}); 

Chỉ cần đảm bảo đăng ký phần mềm trung gian này trước bất kỳ phần mềm trung gian nào khác có thể sửa đổi phản hồi.

3

express-mung được thiết kế cho việc này. Thay vì các sự kiện của nó chỉ là phần mềm trung gian hơn. Ví dụ của bạn sẽ trông giống như

const mung = require('express-mung') 

module.exports = mung.json(body => body.modifiedBy = 'me'); 
Các vấn đề liên quan