2013-04-14 11 views
12

Mam bardzo proste pytanie noob node.js. Jak przekazać zmienną do funkcji wyeksportowanej trasy?Node.js przekazuje zmienną do trasy

Trasy złożyć

exports.gettop = function(n, req, res) { 
    console.log(n); 
    res.send(200); 
}; 

File Server

app.get('/api/v1/top100', routes.gettop(100)); 

Error: .get() wymaga funkcje zwrotne, ale dostał [object Niezdefiniowany]

Odpowiedz

25

Dla przykładu, chcesz stworzyć nowa funkcja, która będzie zbliżać się do Twojej wartości: n. W twoim przypadku wykonujesz gettop i przekazujesz zwróconą wartość, aby wyrazić swoją trasę, co oznacza, że ​​musisz zwrócić maszynę do obsługi trasy. (! Bardzo ważne)

exports.gettop = function(n){ 
    return function(req, res) { 
     console.log(n); 
     res.send(200); 
    }; 
}; 
7

Jako alternatywę dla loganfsmyth na rozwiązanie, można zostawić funkcję gettop jak jest i tworzyć częściową funkcję:

app.get('/api/v1/top100', routes.gettop.bind(null, 100)); 
+0

To zaoszczędziło mi wiele problemów i czasu! Dzięki! – Tobi

+0

To dziwne, że ta logika nie działa, gdy związana funkcja (routes.gettop) jest metodą "dziedziczoną" (tj. Zdefiniowana w łańcuchu prototypów obiektu, a nie jako samodzielna metoda). Program obsługi jest zarejestrowany, ale nigdy nie jest wywoływany! – LexLythius

+0

@LexLythius, że nigdy nie zostanie wywołany, brzmi dziwnie. Mogę sobie wyobrazić, że zostanie wywołany z niepoprawnym kontekstem, który w moim przykładzie to 'null', ale dla metody związanej prawdopodobnie powinna być instancja (' routes'). – robertklep

13

jak kod wygląda jesteś Korzystając z ekspresu, możesz korzystać z ekspresowych miejscowych aplikacji i wyrażać locals wyników, aby przekazywać zmienne do trasy. Podczas gdy inne odpowiedzi proponują działające rozwiązania, uważam, że używanie mechanizmów ekspresowych do ustawiania tych zmiennych jest mniej kłopotliwe.

W przypadku miejscowej odpowiedzi (See Express API reference) należy najpierw ustawić zmienną w oprogramowaniu pośredniczącym lub trasie. Pokażę podejście middleware

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

wtedy w trasie można uzyskać dostęp poprzez tę właściwość res.locals.variablename

exports.gettop = function(req, res) { 
    console.log(res.locals.top); 
    res.send(200); 
}; 

W przypadku, gdy chcesz, aby te ustawienia aplikacji szeroki lepszym rozwiązaniem jest używać miejscowych aplikacji (See Express API reference)

ustawić zmienne mieszkańców aplikacji można użyć

app.locals.top = 100; 

Aby uzyskać dostęp do tej zmiennej z trasy używać

exports.gettop = function(req, res){ 
    console.log(req.app.locals.top); 
    res.send(200); 
}; 
+1

W takim przypadku wolałbym 'app.set (...)' i '[req.] App.get (...)', ponieważ nie będzie to miało żadnych skutków ubocznych (ponieważ lokalnie są przekazywane do szablonów). – robertklep

+0

Musiałem wywołać 'next()' wewnątrz funkcji middleware, aby strona się nie zawiesiła. –

+0

@AmirEldor dzięki! Naprawiono problem – saintedlama

Powiązane problemy