2012-07-05 28 views
11

Đây là thiết lập cơ bản. Tôi đang cố gắng để tạo ra một thành phần trung gian đơn giản mà sẽ cho phép tôi dễ dàng truyền dữ liệu từ tuyến đường của tôi trực tiếp đến javascript của tôi ở phía khách hàng. (Rất giống với viên đá quý Gon trong ruby). Con đường tôi đang làm đó là do có một mô-đun đó trông như thế này:Có thể thêm dữ liệu vào đối tượng phản hồi trong mô-đun phần mềm trung gian trong Express.js không?

module.exports = function(){ 
    return function(req,res,next){ 
     var app = req.app; 
     if(typeof(app) == 'undefined'){ 
      var err = new Error("The JShare module requires express"); 
      next(err); 
      return; 
     } 
     res.jshare = {}; 
     app.dynamicHelpers({ 
      includeJShare: function(req,res){ 
       if(typeof(res.jshare) === 'undefined'){ 
        return ""; 
       } 
       return function(){ 
        return '<script type="text/javascript">window.jshare=' + JSON.stringify(res.jshare) + '</script>'; 
       } 
      } 
     }); 
     next(); 
    }; 
} 

Sau đó, trong lộ trình của tôi, tôi có thể làm điều này:

exports.index = function(req, res){ 
    res.jshare.person = {firstName : "Alex"}; 
    res.render('index', { title: 'Express' }) 
}; 

Cuối cùng trong layout.jade:

!{includeJShare()} 

Điều gì xảy ra ở đầu ra một dòng javascript trên máy khách tạo đối tượng JSON chính xác đã được tạo phía máy chủ.

Đây là câu hỏi; tất cả đều hoạt động như mong đợi, nhưng là mới đối với Express và Node.js nói chung, tôi chỉ tò mò nếu gắn các thuộc tính vào đối tượng phản hồi là OK, hoặc có điều gì đó sai khi thực hiện nó mà tôi chỉ đơn giản là nhìn? Vì một lý do nào đó nó không vượt qua "thử nghiệm mùi" của tôi nhưng tôi không chắc tại sao .....

Trả lời

10

Nó hoàn toàn OK. Đó là cách JavaScript được thiết kế. Chỉ có điều bạn nên cẩn thận là không vô tình ghi đè các thuộc tính hiện có hoặc bị người khác ghi đè. Để an toàn hơn, thay vì thêm mọi thứ trực tiếp vào các đối tượng req/res, bạn có thể xem xét đi sâu hơn:

res.mydata={} 
res.mydata.person= ... 

Như vậy.

+0

Cảm ơn phản hồi của bạn. Nếu bạn nhìn vào mẫu mã của tôi, tôi tin rằng tôi sẽ đi sâu hơn một cấp, tôi có "res.jshare.person". Đó có phải ý của bạn? – BFree

+0

Vâng, đó chính là điều tôi muốn nói. Tôi không có ý chỉ trích mã của bạn, tôi chỉ muốn nhấn mạnh nó. Vì vậy, bạn đã làm nó đã đúng và jshare không giống như một từ chung chung mà sẽ kết thúc được sử dụng bởi một thư viện. Nó tốt. :) – hasanyasin

+0

Tôi cũng không thể nghĩ ra lý do, nhưng tôi thường thấy nhiều thứ được thêm vào yêu cầu. Sức mạnh của nút và kết nối/Express xuất phát từ việc truyền các vật thể này xung quanh, và mỗi lớp mở rộng chúng theo cách riêng của nó. Ví dụ, Express thêm gửi() vào đối tượng phản hồi. –

35

Tôi biết đây là một chủ đề cũ, nhưng có điều gì đó khác để thêm vào chủ đề này.

Express có đối tượng response.locals có nghĩa là cho mục đích này - mở rộng phản hồi từ phần mềm trung gian để làm cho nó có sẵn cho chế độ xem.

Bạn có thể thêm thuộc tính trực tiếp vào đối tượng phản hồi và như đã chỉ ra cách JavaScript được thiết kế. Nhưng Express, cụ thể hơn, có một cách đặc biệt mà họ thích chúng tôi làm điều đó.

Điều này có thể mới ở tốc độ 3.x, không chắc chắn. Có lẽ nó không tồn tại khi câu hỏi này được hỏi.

Để biết chi tiết, xem

http://expressjs.com/en/api.html#res.locals

Ngoài ra còn có một app.locals cho các đối tượng mà không thay đổi từ yêu cầu để yêu cầu (hoặc đối phó với phản ứng tôi giả sử).

http://expressjs.com/en/api.html#app.locals

+0

dude, liên kết của bạn bị hỏng và tôi không thể tìm thấy bất kỳ tài liệu tham khảo này? – Himmators

+1

Nhóm Express đã thay đổi mẫu URL trang web của họ để bao gồm mã ngôn ngữ. Tôi đã cập nhật các liên kết trong câu trả lời này để sử dụng "vi", hoạt động chính xác. – Brandon

+0

Đây là câu trả lời hay hơn, @Bfree, bạn nên thay đổi nó! – Himmators

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