Как подключить суб-приложения express.js?
У меня есть несколько приложений, которые я пытаюсь объединить в один "набор": 2 приложения являются автономными, один - просто слоем auth (используя everyauth для FB Connect). Я хочу настроить его так:
- /- (домашний) список приложений
- /auth - логин для любого приложения
- /app1 - требуется вход через /auth для доступа
- /app2 - (тот же)
Я рассмотрел возможность оставить app1 и app2 автономными, причем верхний слой является прокси-сервером, но я думаю, что было бы сложно разделить между ними систему auth.
Virtualhosts (через Connect) может работать, но мне не обязательно нужен субдомен DNS'd для каждого из них.
Поэтому вместо этого я хотел бы, чтобы основное приложение являлось слоем auth, а остальные "монтировались" в него, причем базовый путь, установленный в каждом приложении, был подпуть. (базовый путь упоминается в выражении Guide, но не задокументирован.)
Все они используют MongoDB, уровень auth использует connect-mongodb для сеансов, поэтому я надеюсь, что они смогут совместно использовать весь уровень аутентификации/сеанса между ними.
В другом потоке Как обмениваться сеансами в установленных экспресс-приложениях, пишет Стивен,
У меня довольно сложное экспресс-приложение для веб-приложений, которое разделено на несколько вспомогательных приложений, которые также являются экспресс-приложениями (с помощью app.use())...
Итак, как использовать app.use()
для монтирования суб-приложения? Я просто пытался использовать var subApp = require('./subapp/app.js')
, при этом listen()
работает только в суб-приложении, когда ! module.parent
(а не как суб-приложение)... но это, похоже, загружает все пути суб-приложения прямо в родительское приложение. Я пробовал настройку basepath
с помощью app.set('basepath', '/subapp/')
, app.basepath = '/subapp/'
и т.д. Как в самом суб-приложении, так и в родительском приложении, но это, похоже, не имеет никакого эффекта.
Установка таких приложений делает невероятно гибкой, но неясно, как это сделать... любые советы были бы очень желанными! (И я рад поделиться уроками из моей реализации everyauth, если кто-то борется с этим.)
Ответы
Ответ 1
app.use(uri, instanceOfExpressServer)
Просто убедитесь, что вы не вызываете .listen
на нем.
Альтернативой является использование require("cluster")
и вызов всех ваших приложений в одном ведущем устройстве, чтобы они имели один и тот же порт. Затем просто выполните маршрутизацию "просто работайте"
Ответ 2
Не уверен, что это поможет вам, но я искал префикс моих маршрутов API. Я сделал то, что когда я инициализировал маршрутизатор, я добавил путь монтирования. Таким образом, моя конфигурация выглядит следующим образом:
//Default configuration
app.configure(function(){
app.use(express.compress());
app.use(express.logger('dev'));
app.set('json spaces',0);
app.use(express.limit('2mb'));
app.use(express.bodyParser());
app.use('/api', app.router);
app.use(function(err, req, res, callback){
res.json(err.code, {});
});
});
Обратите внимание на "/api" при вызове маршрутизатора