2013-03-13 4 views
7

Я пытаюсь порт сценария, который я написал для заводного к нефриту, и запустить в блок камняприбудет агент пользователя внутри нефрита

Мне нужно получить доступ к агенту пользователя внутри файла нефрита. Вот что я пробовал до сих пор:

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

каждый раз, когда я получаю ошибку 500 от экспресс. Возможно ли это?

Я знаю, что могу сделать это в модуле и передать его в оператор render, но это означало бы передачу его КАЖДОЙ визуализации, поскольку он должен быть глобальным.

Очень новый для узла и смущен. Спасибо, ТАК.

+0

Он должен быть принят, чтобы сделать каждый запрос приходит, агент пользователя может быть различным для каждого запроса. – user568109

+0

и нефрит выдается для каждого запроса – Fresheyeball

+0

да, ответ предоставляется для каждого запроса отдельно. – user568109

ответ

12

Просто написать собственный крохотный промежуточного

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

Надень до вашего 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'))); 
}); 

Затем вы можете использовать переменную ua в любом jade шаблоне (например index.jade)

extends layout 

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

Работал отлично. Только один быстрый вопрос о том, почему размещение в app.configure важно? – Fresheyeball

+1

хорошо вопрос! вы могли бы поместить его куда угодно. Я стараюсь поместить свое промежуточное программное обеспечение непосредственно перед маршрутизатором, потому что тогда выполняется вся обработка (разбор тела, сеансов и т. Д.) И управление маршрутами. – zemirco

+0

Я положил его на дно, и он сломался, por que? – Fresheyeball

4

Вы можете передать user-agent от экспресс-нефрит (см here)

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

в файле нефрита

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

Это единственный способ? Невозможно сделать это глобально? – Fresheyeball

+0

См. Здесь: http://stackoverflow.com/questions/12088557/global-variable-for-jade-templates-in-node-js jade scope отличается от узла, поэтому вы должны передать его в рендеринг, если хотите использовать Это. – user568109

Смежные вопросы