2013-08-18 30 views
17

Với mọi phần mềm trung gian, Express chuyển một đối tượng resreq. Các đối tượng này mở rộng các đối tượng địa lý tương ứng là http.ServerResponsehttp.ClientRequest. Tôi muốn biết nếu nó có thể ghi đè hoặc mở rộng các phương thức của đối tượng phản hồi.Trong Express và Node.js, có thể mở rộng hoặc ghi đè các phương thức của đối tượng phản hồi không?

Ví dụ: thay vì res.render('home', jsonData);, tôi muốn mở rộng res bằng phương thức tùy chỉnh được gọi là customRender và sử dụng nó như sau: res.customRender().

Tôi không bị kẹt ở một vấn đề cụ thể hoặc bất kỳ điều gì. Tôi chỉ muốn tìm hiểu cách mở rộng các đối tượng gốc hoặc, như trong trường hợp này, đối tượng đến từ mô-đun bên thứ 3 trong Node.js

Trả lời

28

Ý tưởng tốt nhất sẽ có thêm một phương pháp tùy chỉnh để nguyên mẫu của đối tượng response:

var express = require("express"); 

express.response.customRender = function() { 
    // your stuff goes here 
}; 

Và chức năng này nên có thể truy cập bởi tất cả các đối tượng res.

Bạn có thể đọc mã nguồn để xem cách chúng mở rộng đối tượng gốc. Về cơ bản họ đang làm nguyên mẫu chaining:

nhanh/lib/response.js

var res = module.exports = { 
    __proto__: http.ServerResponse.prototype 
}; 

Và đối tượng này trở thành một nguyên mẫu của đối tượng response newely tạo (mà xuất phát từ khung kết nối):

res.__proto__ = app.response; 

(app.response chỉ là bí danh cho res được xác định ở trên). Lưu ý rằng thuộc tính __proto__ là tham chiếu đến nguyên mẫu của một đối tượng.

Được cảnh báo. Trước hết, __proto__ không phải là một phần của EcmaScript (nó có thể không có sẵn trong các triển khai JavaScript khác). Thứ hai: thông thường bạn sẽ làm thừa kế với Object.create (thiết lập __proto__ trực tiếp trên một đối tượng là một bản vá khỉ và nó thường là một thực tế xấu, nó có thể phá vỡ nhiều điều). Đọc thêm về điều đó tại đây:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Inheritance_and_the_prototype_chain

+0

tính năng này không hoạt động. từ bên trong ngữ cảnh có thể gọi 'this' sẽ là hàm được xuất thay vì đối tượng' response'. – r3wt

+0

Bạn cũng có thể mở rộng cá thể thể hiện được xây dựng theo cùng một kiểu (thay vì hàm khởi tạo nhanh). ví dụ: var app = express(); app.response.foo = function() {console.log ('foo');} – Porlune

9

Chỉ cần thêm phần mềm trung gian bổ sung chức năng customRender để res.

function(req, res, next) { 
    res.customRender = function() { 
    // implement your custom renderer 
    } 
    next(); 
} 
+0

Cool. Cảm ơn! Bạn có biết Express mở rộng chức năng của các lớp http gốc không? –

+11

Điều này sẽ tạo ra một chức năng mới cho mỗi phản ứng mặc dù, nó tốt hơn để sử dụng 'util.inherits' và thêm nó một lần để nguyên mẫu. –

+2

Hoặc gán chức năng cho biến và gán res.customRenger = fn; (hoặc kết thúc cuộc gọi nếu bạn cần req, res, next) – JakubKnejzlik

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