2012-07-05 13 views
11

Oto podstawowa konfiguracja. Próbuję utworzyć prosty komponent oprogramowania pośredniego, który pozwoli mi z łatwością przekazywać dane z mojej trasy bezpośrednio do mojego javascript po stronie klienta. (Bardzo podobny do klejnotu Gon w kolorze ruby). Sposób, w jaki to robię to poprzez moduł, który wygląda tak:Czy można dodać dane do obiektu odpowiedzi w module oprogramowania pośredniego w Express.js?

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(); 
    }; 
} 

Następnie w mojej trasie mogę to zrobić:

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

Wreszcie w layout.jade:

!{includeJShare()} 

To, co robi, wypisuje linię klienta javascript na kliencie, która tworzy dokładny obiekt JSON, który został utworzony po stronie serwera.

Oto pytanie; wszystko działa zgodnie z oczekiwaniami, ale będąc nowicjuszem w Express i Node.js ogólnie, byłem po prostu ciekawy, czy przypisywanie właściwości do obiektu odpowiedzi jest w porządku, czy jest coś złego w robieniu tego, że po prostu przeoczam? Z jakiegoś powodu nie spełnia on mojego "testu zapachu", ale nie jestem pewien, dlaczego .....

Odpowiedz

10

Jest całkowicie OK. Tak zaprojektowano JavaScript. Jedyną rzeczą, na którą powinieneś być ostrożny, jest nieumyślne pominięcie istniejących właściwości lub nadpisanie przez inne. Aby być bezpieczniejsze, zamiast dodawania wszystko bezpośrednio do REQ/RES obiektów, można rozważyć wyjście poziom głębiej:

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

tak.

+0

Dzięki za odpowiedź. Jeśli spojrzysz na próbkę mojego kodu, myślę, że idę o jeden poziom głębiej, mam "res.jshare.person". Czy to miałeś na myśli? – BFree

+0

Tak, właśnie o to mi chodziło. Nie chciałem krytykować twojego kodu, chciałem go tylko podkreślić. Więc zrobiłeś to już poprawne i jshare nie wygląda jak ogólne słowo, które w końcu zostanie użyte przez inną bibliotekę. To jest dobre. :) – hasanyasin

+0

Nie mogę wymyślić żadnego powodu, ale częściej widziałem rzeczy dodane do wniosku. Moc Node i Connect/Express wynika z przekazywania tych obiektów, a każda warstwa rozszerza je w swój własny sposób. Express dodaje na przykład send() do obiektu odpowiedzi. –

35

Wiem, że to stary wątek, ale jest jeszcze coś, co można dodać do tego tematu.

Express ma obiekt response.locals przeznaczony do tego celu - rozszerzenie odpowiedzi z oprogramowania pośredniego w celu udostępnienia widoków.

Możesz dodać właściwość bezpośrednio do obiektu odpowiedzi i jak zaprojektowano JavaScript. Ale Express, a konkretniej, ma szczególny sposób, w jaki wolą to robić.

To może być nowe w Express 3.x, nie jestem pewien. Być może nie istniało, gdy zadawano to pytanie.

Szczegółowe informacje

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

Istnieje również app.locals dla obiektów, które nie różnią się od wniosku do kupna (lub odpowiedzi na odpowiedzi ja przypuszczam).

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

+0

stary, twój link jest zepsuty i nie mogę znaleźć żadnego odniesienia do tego? – Himmators

+1

Zespół Ekspresowy zmienił wzorzec adresu URL strony internetowej tak, aby zawierał kod lokalizacji. Zaktualizowałem linki w tej odpowiedzi, aby użyć "en", która działa poprawnie. – Brandon

+0

To jest lepsza odpowiedź, @Bfree, powinieneś to zmienić! – Himmators

Powiązane problemy