2015-03-13 13 views
5

W mojej aplikacji Node.js niektóre zmienne, które renderują się lub każda trasa są wspólne. Istnieje około 4-5 zmiennych, które są renderowane na każdej trasie. Mam około 20 tras.jak renderować wspólne zmienne z app.js na wszystkie trasy ekspresowe

Obecnie robie przejściu tych zmiennych w każdej trasy w res.render

Czy istnieje metoda, dzięki której można przekazać tych wspólnych zmiennych w jakimś miejscu „(np app.js)`, która jest używana przez każdy trasa, dzięki czemu mogę trochę wyczyścić mój kod.

Używam express.js dla węzła i handlebars dla szablonu.

EDIT: Myślę, że powinienem wyjaśnić nieco więcej

res.render('abc', { 
         commonitem1: 'one', 
         commonitem2: 'two', 
         ... 
        }); 

------------------------------------- 
another route 
res.render('xyz', { 
         commonitem1: 'one', 
         commonitem2: 'two', 
         ... 
        }); 

Chcę tego uniknąć powtarzania w każdych moich dróg i chce uczynić go ze wspólnego miejsca.

+0

Myślę, że możesz użyć tego: 'app.set (" someOptions "," value "); 'i pobierz za pomocą' app.get ("someOption"); ' – GeekRiky

Odpowiedz

6

Na sesji lub zażądania wartości zależne można przechowywać tych wspólnych wartości w zmiennej globalnej, a następnie wykorzystać je bezpośrednio w res.render . Aby to zrobić, że masz następujące opcje

  • Zastosowanie app.use do przechowywania wartości:

W swoim app.js dodać middleware, który robi to za ciebie. Pamiętaj o zapisaniu tego oprogramowania pośredniego przed innymi zdefiniowanymi trasami, ponieważ funkcje oprogramowania pośredniego są wykonywane sekwencyjnie.

app.use(function(req, res, next){ 
    res.locals.items = "Value"; 
    next(); 
}); 
//your routes follow 
app.use(‘/’, home); 

Na twoich trasach możesz umieścić items bezpośrednio w res.renderowanie jak:

res.render('layout', {title: 'My awesome title',view: 'home', item :res.locals.items }); 
  • Korzystanie wyrazić sesję do przechowywania wartości:

Jeśli ekspresowej sesja zainstalowaniu można zapisać jakieś dane w req.session.item i umieścić je w dowolnej trasie jak:

res.render('layout', {title: 'My awesome title',view: 'home', item :req.session.items }); 
+0

Moja emisja nie przynosi wartości na każdej trasie. Otrzymuję go z pliku globalnego, w którym ustawiam wspólne zmienne. Ale za uzyskanie wartości w moim szablonie przekazuję ją w każdym "res.render" na każdej trasie. Chcę tego uniknąć i zrobić to z jednego wspólnego miejsca. – zamil

+0

Rozumiem twój problem; chcesz, aby niektóre elementy wspólne, takie jak menu paska bocznego, w swoich układach, aby były generowane, powinny być używane na wielu stronach bez ponawiania wymaganych wartości. A więc coś takiego, renderowanie "strony głównej" wywołuje "pasek boczny", który pobiera wymagane wartości i umieszcza się na "stronie głównej". (Myśląc o tym) –

+1

Użyj 'res.locals'. Stwórz funkcję, która jest wywoływana przed trasami, które wymagają wspólnych zmiennych. W tej funkcji przypisz 'res.locals.varname' pewną wartość. W twoich układach możesz teraz użyć 'varname'. –

4

Wygląda na to, że poszukuje się res.locals - ten obiekt jest przekazywany do widoków dla każdego żądania i jest dopasowany do każdego indywidualnego żądania (tj. Każde żądanie może mieć własną wersję res.locals). Istnieje również app.locals, który jest wspólny dla wszystkich żądań.

nie mam praktycznego doświadczenia z tym, ale można użyć tego obiektu, aby przejść wszystkie zmienne do swoich poglądów, a może Express połączyć to, co jest w app.locals z res.locals i co wysłać do widoku poprzez res.render(). Przetestuj uważnie, nie znalazłem odpowiednich informacji na temat scalania w oficjalnych dokumentach.

Aby zapełnić kod res.locals, aby zachować kod DRY, można napisać obiekt custom middleware, który zapełnia obiekt dowolną potrzebą przed wykonaniem rzeczywistej logiki trasy.

+0

Dzięki za wprowadzenie mnie do res.locals :) – zamil

0

Można utworzyć jeden plik constants.js z kodem poniżej

(function (constants) { 
    var FetchDataErrorMessage = "Error while fetching User Data"; 
    var ConnectionErroMessage = "Error while fetching Connecting Server"; 
    var InsertDataErrorMessage = "Error while inserting User Data"; 
    var RemoveDataErrorMessage = "Error while removing User Data"; 
    var UpdateDataErrorMessage = "Error while updating User Data"; 
})(module.exports); 

w dowolnym pliku, gdzie trzeba użyć tych zmiennych można dodać poniżej kodu.

var constants = require('constants');  
console.write(constants.RemoveDataErrorMessage); 

wyjściowa: - „Błąd podczas usuwania danych użytkownika”

+0

Nie eksportujesz niczego ... Zwróć też uwagę, że nie jest konieczne w Node.js do zamykania modułów w [IIFE] (http://en.wikipedia.org/wiki/Immediately-invoked_function_expression) s Węzeł robi to za Ciebie. –

Powiązane problemy