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

На данный момент они все в одном файле, и мне это не нравится.


person Sterling Archer    schedule 12.05.2014    source источник


Ответы (3)


Я думаю, что человек имел в виду, говоря «проходить мимо», было что-то вроде этого (в прямом выражении):

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);
  });
};
person SomeKittens    schedule 12.05.2014

Это видео от TJ Holowaychuk (парня, который написал Express и массу другой инфраструктуры Node, которую мы все используем) помогло мне вывести модульность Express на новый уровень. По сути, вы можете создавать отдельные приложения в их собственных папках и очень легко использовать их в качестве промежуточного программного обеспечения. Мне удалось распространить эту технику на socket.io с помощью некоторых трюков.

http://vimeo.com/56166857

person azurelogic    schedule 12.05.2014
comment
Дополнительные ссылки великолепны, но не должны содержать суть вашего ответа. - person SomeKittens; 12.05.2014

Вы не должны передавать req и res другим модулям, но передавать обратные вызовы из других модулей для маршрутизации. Это должно выглядеть.

var someModule = require("./someModule")

app.get("/someAction", someModule.handleSomeAction) ;

Если вы хотите получить сообщение и получить другие модули, вы должны передать ссылку на приложение (из экспресс()) один раз в этот модуль и работать с ним.

Например :

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 
} 
person Krzysztof Wende    schedule 12.05.2014