Предупреждение: ссылка на код, который я взломал для нокаута узла, это отчасти работает, но далеко не элегантно и не отполировано.
Если говорить более конкретно о разделении app.js
У меня естьследующий app.js file
var express = require('express'),
bootstrap = require('./init/bootstrap.js'),
app = module.exports = express.createServer();
bootstrap(app);
Это в основном означает, что я помещаю всю свою загрузку в отдельный файл, затем загружаю сервер.
Так что же делает bootstrap do?
var configure = require("./app-configure.js"),
less = require("./watch-less.js"),
everyauth = require("./config-everyauth.js"),
routes = require("./start-routes.js"),
tools = require("buffertools"),
nko = require("nko"),
sessionStore = new (require("express").session.MemoryStore)()
module.exports = function(app) {
everyauth(app);
configure(app, sessionStore);
less();
routes(app, sessionStore);
nko('/9Ehs3Dwu0bSByCS');
app.listen(process.env.PORT);
console.log("server listening on port xxxx");
};
Ну, это разбивает все настройки инициализации сервера на красивые куски.В частности,
- У меня есть чанк, который устанавливает всю мою удаленную проверку подлинности OAuth с использованием Everyauth.
- У меня есть чанк, который настраивает мое приложение (в основном вызывает
app.configure
) - У меня есть немного кода, который меньше пробивает, поэтому он перекомпилирует все мои меньше в css во время выполнения.
- У меня есть код, который устанавливает все мои маршруты
- Я звонюэтот маленький nko-модуль
- Наконец я запускаю сервер, прослушивая порт.
Просто для примера давайте рассмотрим маршрутизацию файл
var fs = require("fs"),
parseCookie = require('connect').utils.parseCookie;
module.exports = function(app, sessionStore) {
var modelUrl = __dirname + "/../model/",
models = fs.readdirSync(modelUrl),
routeUrl = __dirname + "/../route/"
routes = fs.readdirSync(routeUrl);
Здесь я загружаю все свои модели и маршруты в виде массивов файлов.
Отказ от ответственности: readdirSync
подходит только при вызове перед запуском http-сервера (до .listen
).Вызов синхронных блокирующих вызовов во время запуска сервера просто делает код более читабельным (это в основном хак)
var io = require("socket.io").listen(app);
io.set("authorization", function(data, accept) {
if (data.headers.cookie) {
data.cookie = parseCookie(data.headers.cookie);
data.sessionId = data.cookie['express.sid'];
sessionStore.get(data.sessionId, function(err, session) {
if (err) {
return accept(err.message, false);
} else if (!(session && session.auth)) {
return accept("not authorized", false)
}
data.session = session;
accept(null, true);
});
} else {
return accept('No cookie', false);
}
});
Здесь я пробиваю socket.io, чтобы фактически использовать авторизацию, а не позволять любому тому и джеку разговаривать с моимсервер socket.io
routes.forEach(function(file) {
var route = require(routeUrl + file),
model = require(modelUrl + file);
route(app, model, io);
});
};
Здесь я начинаю свои маршруты, передавая соответствующую модель в каждый объект маршрута, возвращаемый из файла маршрута.
По сути, вы организовываете все в красивые маленькие модулиа затем есть механизм начальной загрузки.
Мой другой проект (мой блог) имеет файл инициализации с аналогичной структурой .
Отказ от ответственности: блог сломан и не собирается, я работаю над этим.