2013-02-24 46 views
19

Có thể thông qua phần mềm trung gian cao cấp hay phương pháp khác để thêm dữ liệu hiển thị (tùy chọn thứ hai trong res.render) cho mỗi cuộc gọi trong tuyến ứng dụng.Node.js Express3 - Phần mềm trung gian để thêm dữ liệu hiển thị vào tất cả các yêu cầu hiển thị

Ứng dụng của tôi đang sử dụng hộ chiếu để xác thực và tôi muốn phần mềm trung gian luôn thêm thông tin người dùng vào từng mẫu được hiển thị.

Hiện tại, mỗi cuộc gọi của tôi để res.render trông giống như. Tôi muốn xóa người dùng: req.user và thêm người dùng đó vào chức năng phần mềm trung gian.

// Page 1 
res.render("somepage1",{data : "somepage1", user : req.user}); 

// Page 2 
res.render("somepage2",{data : "somepage2", user : req.user}); 
+0

liên quan ?: [Execute móc trên tất cả các yêu cầu HTTP, trước khi app.get() và app.post()?] (Http://stackoverflow.com/questions/13106300) – laggingreflex

Trả lời

27

nhanh không cung cấp app.localsres.locals, mà nó automatically merges với người dân địa phương rõ ràng thông qua vào render bởi một handler tuyến.

app.use(function(req, res, next) { 
    res.locals.user = req.user; 
    next(); 
}); 

Ngoài ra, bạn có thể vá nóng chức năng render. Tôi muốn tránh điều này vì nó là phụ phí, nhưng nếu vì lý do nào đó bạn cần truyền thông tin không có sẵn trước khi trình xử lý tuyến đường của bạn chạy, thì đó là một tùy chọn:

app.use(function(req, res, next) { 
    var render = res.render; 
    res.render = function(view, locals, cb) { 
     if (typeof locals == 'object') locals.user = req.user; 
     render.call(res, view, locals, cb); 
    }; 
    next(); 
}); 
+0

Điều đầu tiên tôi đã thử, không hoạt động. res.render là một phần của một đối tượng mà phương thức đó phá vỡ. –

+0

Bạn phải bảo toàn ngữ cảnh 'render' thông qua [' call'] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/call). – josh3736

+0

Tôi hiểu rồi, tôi đoán điều đó sẽ hiệu quả. Đã tìm một cách khác thông qua người dân địa phương mà có lẽ là cách chính xác hơn để làm điều đó. Cảm ơn! –

9

Đã tìm ra.

Bạn có thể sử dụng người dân địa phương trong phần mềm trung gian của mình.

app.use(function(req, res, next){ 
    res.locals.user = req.user; 
    next(); 
    }); 

Sau đó, khi sử dụng mẫu.

<h1>User Name:{{user.name}}</h1> 

<h1>User Name:{{_locals.user.name}}</h1>

+5

Bạn thực sự không nên sử dụng' _locals' trong mẫu. Express [tự động kết hợp biến nội bộ đó vào đối tượng cấp cao nhất] (https://github.com/visionmedia/express/blob/3.1.0/lib/application.js#L467-474). – josh3736

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