Я работаю над очень простой проблемой 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());
Любые мысли?
Это походит маршрут отдавая шаблон объявляется перед промежуточным программным обеспечением, которое устанавливает 'res.locals'. Покажите маршрут, обслуживающий шаблон, а также вашу настройку маршрутизации для Express. – robertklep
Хмм, держись ... Я думаю, что вы можете вводить в заблуждение шаблоны на стороне клиента по сравнению с серверными шаблонами. Переменная 'res.locals' является частью шаблонов на стороне сервера, что означает, что она не автоматически отображается как переменная в любых клиентских шаблонах. Сначала вам нужно обработать их с помощью серверного шаблонизатора. – robertklep
Я думаю, что это может быть связано с проблемой ... Когда я использую app.get следующим образом: 'app.get ('/', function (reg, res) {console.log (" test ");}); 'Кажется, моя маршрутизация на стороне сервера не ударяется. Не знаю, почему, но я предполагаю, что сервер обслуживает маршрут статически, а затем полагается на Backbone для навигации. – silvermanip