2013-10-03 11 views
1

Я работаю над очень простой проблемой nodejs слишком долго в этом месте, и я застрял. Другие задавали подобные вопросы, но почему-то ответы не работают для меня.Доступ к res.locals из Backbone.Router шаблоны

фон:

Я просто наращиваю с NodeJS с Express, Backbone, & паспорта для авт. Паспорт сохраняет пользовательский объект в запросе, поэтому я пытаюсь передать его на мои представления Backbone.

Я использовал проект Node Cellar в качестве отправной точки и следил за их отображением большинства моих просмотров через Backbone.Router.extend.

То, что я пытаюсь сделать:

Я просто хочу, чтобы передать объект пользователя на вид и дисплей, например, имя в моем шаблоне.

Что я пробовал:

Я использую промежуточное программное обеспечение, аналогичное ниже, чтобы передать мои пользователю модели

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

Когда я использую app.get непосредственно я могу подтвердить, что это работает:

app.get('/test',function index(req, res) { 
    res.send(res.locals.user); 
}); 

Однако, если я включать следующее в моем HeaderView.html файл все ломается (даже если я могу подтвердить, пользователь определяется с помощью app.get):

<%= user === null ? "No user" : user %> (or user.name.familyName, etc.) 

Я получаю следующее сообщение об ошибке в консоли:

Uncaught ReferenceError: user is not defined 

Вот что мой main.js выглядит следующим образом:

var AppRouter = Backbone.Router.extend({ 
    routes: { 
     "home"    : "home" 
    }, 

initialize: function() { 
    this.headerView = new HeaderView(); 
    $('.header').html(this.headerView.el); 

    var footerView = new FooterView(); 
    $('#footer').html(footerView.el); 
}, 

home: function (id) { 
    if (!this.homeView) { 
     this.homeView = new HomeView(); 
    } 
    $('#content').html(this.homeView.el); 
}, 

}); 

utils.loadTemplate(['HomeView'], function() { 
    app = new AppRouter(); 
    Backbone.history.start(); 
}); 

Вот как я настройка экспресс:

app.set('port', process.env.PORT || 3000); 
app.use(express.logger('default')); /* 'default', 'short', 'tiny', 'dev' */ 
app.use(express.bodyParser()), 
app.use(express.static(path.join(config.root, 'public'))); 
app.use(express.cookieParser('optional secret string')); 
app.use(express.session({ secret: 'my secret secret key' })); 
app.use(passport.initialize()); 
app.use(passport.session()); 

Любые мысли?

+0

Это походит маршрут отдавая шаблон объявляется перед промежуточным программным обеспечением, которое устанавливает 'res.locals'. Покажите маршрут, обслуживающий шаблон, а также вашу настройку маршрутизации для Express. – robertklep

+0

Хмм, держись ... Я думаю, что вы можете вводить в заблуждение шаблоны на стороне клиента по сравнению с серверными шаблонами. Переменная 'res.locals' является частью шаблонов на стороне сервера, что означает, что она не автоматически отображается как переменная в любых клиентских шаблонах. Сначала вам нужно обработать их с помощью серверного шаблонизатора. – robertklep

+0

Я думаю, что это может быть связано с проблемой ... Когда я использую app.get следующим образом: 'app.get ('/', function (reg, res) {console.log (" test ");}); 'Кажется, моя маршрутизация на стороне сервера не ударяется. Не знаю, почему, но я предполагаю, что сервер обслуживает маршрут статически, а затем полагается на Backbone для навигации. – silvermanip

ответ

0

я снять свой Предварительный ответ, как это было недальновидным :)

Похоже, что вы можете найти ответ на свой вопрос здесь: ExpressJS 3.0 How to pass res.locals to a jade view?

HTH,
Аарон

+1

Нет, ['res.locals'] (http://expressjs.com/api.html#res.locals) действительно то, что нужно использовать здесь. 'app.locals' предназначены для переменных приложения (которые' req.user' не являются). – robertklep

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