Модуляция NodeJS
Итак, мне сказали, что переход вокруг переменной request
и или response
в nodeJS является "плохой практикой". Но это означает, что большая часть вашего кода должна быть в файле server.js, что делает его загроможденным и уродливым.
Как вы можете модулизовать сервер nodejs, соответствующим образом обходя req/res
и уметь организовать свой код в отдельные файлы?
Например, я хотел бы разделить мою маршрутизацию сокетов, .get
и .post
в разные файлы, но все же иметь возможность использовать такие параметры обратного вызова:
app.io.route("disconnect", function(req,res) { <--- these params
db.query("UPDATE player_data SET online=0 WHERE id="+mysql.escape(req.session.user));
req.io.broadcast("event", {msg:req.session.username+" has logged out!"});
app.io.broadcast("reloadXY");
});
Как сейчас, они все в одном файле, и мне это не нравится.
Ответы
Ответ 1
Я думаю, что человек имел в виду, "проходя вокруг", был чем-то вроде этого (в простом выражении):
app.get('/kittens', function(req, res) {
db.doAthing(req);
updateSomethingElse(res);
upvoteThisAnswer(res);
});
То есть, обойти две переменные за пределами первой функции. Это плохо, потому что становится все труднее понять, где вызов действительно заканчивается. Одна маленькая res.end(500)
в updateSomethingElse
может привести к падению всего карточного дома.
Это совершенно нормально (по сути, стандартно, чтобы быть стандартным в экспресс), чтобы объявить этот обратный вызов в другом месте (обычно это каталог /routes
вашего проекта.)
// app.js
var user = require('./routes/user')
, kittens = require('./routes/kittens');
// express stuff...
app.get('/settings', user.getSettings);
app.get('/fur', kittens.shed);
Затем в routes/user.js
:
exports.getSettings = function(req, res) {
// Note how we're passing around properties of req/res, not the objects themselves.
db.getUserSettings(req.user.id).then(function(settings) {
res.render('settings', settings);
});
};
Ответ 2
Это видео от TJ Holowaychuk (парень, который написал "Экспресс" и тонну другой инфраструктуры Node, которую мы все используем) помог мне принять экспресс-модуляцию на следующий уровень. В основном вы можете сделать отдельные приложения в своих собственных папках и использовать их в качестве промежуточного программного обеспечения очень легко. Мне удалось распространить эту технику на socket.io с некоторыми трюками.
http://vimeo.com/56166857
Ответ 3
Вам не следует передавать req и res на другие модули, но передавать обратные вызовы из других модулей для маршрутизации.
Это должно выглядеть.
var someModule = require("./someModule")
app.get("/someAction", someModule.handleSomeAction) ;
Если вы хотите иметь сообщение и входить в другие модули, вы должны передать ссылку на приложение (из express()) один раз в этот модуль и работать с ним.
Например:
var express = require("express") ;
var app = express();
var get_handler = require("./get_handler ")
var post_handler = require("./post_handler ")
get_handler.init(app);
post_handler.init(app);
и в post/get_handler:
var app;
exports.init = function( eApp){
app = eApp;
// operate on app
}