Node.js, миграция с Express 2 на Express 3

Сегодня я решил обновить игровой сервер citadeli.ru. Как оказалось, к тому моменту уже вышла новая, 3-ья версия фреймворка express, и возникли проблемы обратной совместимости сервера

dynamicHelpers более не существует

на смену пришли app.locals. Есть серьезное отличие — app.locals не передаются объекты req и res, если хелперы срабатывали в момент вызова, то app.locals устанавливаются до обработки запроса, на этапе app.configure

было:

[javascript]
app.dynamicHelpers({
locale: function(req, res){
//return i18n.getLocale(req);
return ‘ru’;
},
headTitle: function(req, res){
return function(title){
var headTitle = __(‘Citadels online’);
if (title){
headTitle = __(title) + ‘. ‘ + headTitle;
}
return headTitle;
}
},
session: function(req, res){
return req.session;
},
currentUser: function (req, res) {
return app.user(req);
},
currentGame: function (req, res) {
var currentGame;
if (req.session.user){
currentUser = req.session.user;
games.each(function(game){
var players = game.get(‘players’);
for (i in players){
if (players[i].get(‘user’) && players[i].id == currentUser.login){
currentGame = game;
}
}
});
}
return currentGame;
},
flash: function (req, res) {
return req.flash();
}
});
[/javascript]

стало:

[javascript]
app.use(function(req, res, next){
app.locals.locale = ‘ru’;
app.locals.headTitle = function(title){
var headTitle = __(‘Citadels online’);
if (title){
headTitle = __(title) + ‘. ‘ + headTitle;
}
return headTitle;
};
app.locals.session = req.session;
var currentUser = app.user(req);
app.locals.currentUser = currentUser;
var currentGame;
if (currentUser){
currentUser = req.session.user;
games.each(function(game){
var players = game.get(‘players’);
for (i in players){
if (players[i].get(‘user’) && players[i].id == currentUser.login){
currentGame = game;
}
}
});
}
app.locals.currentGame = currentGame;
next();
});
[/javascript]

Layouts и Partials не поддерживаются

первое, что вы заметите, как только ваш сервер запустится — то, что ваша страница выглядит голой. view отображается без layout-а. Разработчики express решили, что управление иерархией шаблонов — прерогатива шаблонизатора, а не фреймворка, и удалили все что с ними связано из фреймворка.

Я использовал ejs, и пришлось поставить модуль express-ejs-layouts, чтобы все вернуть как было.

app.flash() удалена

Просто смиритесь. или поставьте модуль connect-flash, или перепишите на req.session.messages

req.isXmlHttpRequest удален

используйте синоним — req.xhr

И совсем из области фантастики

При обновлении underscore сломался метод _.shuffle. Расследование показало, что мой _.mixin RANDOM перезаписал новый метод underscore.js — _.random();
Мой выдавал случайный элемент массива, underscore — случайное число от min до max. А новая версия shuffle использует в своем алгоритме метод random, и потому не работает

Оставить комментарий