Модуляция 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 
}