2013-03-13 18 views
7

usiłuję portu skrypt który napisałem dla Groovy nad do jade, i napotkasz przeszkodąget kliencka od wewnątrz jade

muszę otworzyć user-agent od wewnątrz pliku jade. Oto, co próbowałem do tej pory:

- var agent = req.headers['user-agent']; 
- var agent = headers['user-agent']; 
- var agent = navigator.userAgent; 

za każdym razem, gdy otrzymam błąd 500 z ekspresu. Czy to możliwe?

Wiem, że mogłem to zrobić w module i przekazać go do instrukcji render, ale oznaczałoby to przekazanie go do KAŻDEJ renderowania, ponieważ musi być globalne.

Bardzo nowy węzeł i zdezorientowany. Dziękuję.

+0

To powinno być przekazane do renderowania za każdym razem wniosek pochodzi, user-agent może być różny dla każdego żądania. – user568109

+0

i jade są renderowane dla każdego żądania – Fresheyeball

+0

Tak, odpowiedź jest renderowana dla każdego żądania osobno. – user568109

Odpowiedz

12

Wystarczy napisać swój własny mały middleware

app.use(function(req, res, next) { 
    res.locals.ua = req.get('User-Agent'); 
    next(); 
}); 

Put to przed twoim app.router

app.configure(function(){ 
    app.set('port', process.env.PORT || 3000); 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'jade'); 
    app.use(express.favicon()); 
    app.use(express.logger('dev')); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 

    // here 
    app.use(function(req, res, next) { 
    res.locals.ua = req.get('User-Agent'); 
    next(); 
    }); 

    app.use(app.router); 
    app.use(express.static(path.join(__dirname, 'public'))); 
}); 

Następnie można użyć zmiennej ua w dowolnym jade szablonie (np index.jade)

extends layout 

block content 
    h1= title 
    p Welcome to #{title} 
    p=ua 
+0

Pracował świetnie. Jedno szybkie pytanie, dlaczego ważne jest umieszczenie pod app.configure? – Fresheyeball

+1

dobre pytanie! prawdopodobnie możesz umieścić go w dowolnym miejscu. Zwykle umieszczam moje oprogramowanie pośredniczące tuż przed routerem, ponieważ wtedy przetwarzanie (parsowanie ciała, sesje itp.) Jest wykonywane, a trasy są obsługiwane. – zemirco

+0

Położyłem go na dnie i pękło, por que? – Fresheyeball

4

można przekazać user-agent z express do jade: (patrz here)

app.get('/index', function(req, res){ 
    res.render('home.jade', { 
    locals: { 
      useragent: req.getHeader('User-Agent') 
      } 
    }); 
    res.end(); 
}); 

w pliku jade

html 
    body 
    h1 #{useragent} 
script(type='text/javascript') 
    var useragent = #{useragent}; 
+0

Czy to jedyny sposób? Nie ma sposobu, aby zrobić to globalnie? – Fresheyeball

+0

Zobacz tutaj: http://stackoverflow.com/questions/12088557/global-variable-for-jade-templates-in-node -js jade scope różni się od węzła, więc musisz go przekazać w render, jeśli chcesz użyć to. – user568109