Можно ли сделать еще одну экспресс-заявку из экспресса?

По сути, у нас есть сервер приложений, на котором работает экспресс и маршрутизируется к группе SPA. Это было здорово, но затем мы захотели иметь приложение, которое запускает собственный узел/экспресс-скрипт (призрак). Я не могу понять, как настроить маршрут /ghost для перехода к ./webapps/ghost/index.js

Это просто невозможно?


person Z2VvZ3Vp    schedule 08.07.2015    source источник
comment
Вы хотите иметь приложение Express внутри другого в качестве подмаршрута, или вы говорите о проксировании?   -  person tadman    schedule 08.07.2015
comment
Если index.js возвращает экспресс-приложение, да, это вполне возможно. Просто подключите и направьте его, как маршрутизатор, и убедитесь, что index.js не вызывает .listen, если он не включен в качестве модуля.   -  person Kevin B    schedule 08.07.2015
comment
@tadman Я не уверен, что понял вопрос. я хотел бы просто сделать что-то вроде app.get('/ghost','./webapps/ghost/index.js'); я запустил индексный скрипт с npm start и делаю приведенный выше код, но он не работает.   -  person Z2VvZ3Vp    schedule 08.07.2015
comment
Что такое index.js? Если это маршрутизатор Express, вы можете сделать это, но вам нужно будет сделать это с помощью require. Если это совершенно другое приложение, пришло время проксировать его.   -  person tadman    schedule 08.07.2015
comment
@tadman это приложение. Вот он: github.com/TryGhost/Ghost/blob/master/index. js   -  person Z2VvZ3Vp    schedule 08.07.2015
comment
Это то, что вы можете сделать на уровне сервера с правильной конфигурацией виртуального хоста. Обычно это намного проще, чем делегировать через ваше приложение Node. Загрузка одного приложения внутри другого в спешке становится беспорядочной.   -  person tadman    schedule 08.07.2015


Ответы (1)


Вам необходимо перенаправить входящие запросы на экземпляр Ghost Express. Я сделал это на своем личном сайте, добавив маршрут /blog к моему основному экспресс-экземпляру и перенаправив любой запрос к нему в экземпляр Ghost Express. Проверьте это здесь: https://github.com/evanshortiss/evanshortiss.com/blob/master/server.js

Основная суть заключается в том, что вы делаете следующее:

app.use('/blog', function(req, res, next) {
  // Forward this request on...
  return next();
}, ghostServer.rootApp); //...but we forward it to a different express instance

Если вы используете оба процесса как отдельные процессы, вы можете использовать Apache или nginx, чтобы просто перенаправить запросы. Если вам абсолютно необходимо использовать экспресс-приложение для пересылки запросов, попробуйте модуль node-http-proxy.

Если вам нужен прокси из Express, вы можете сделать это с помощью модуля http-proxy от Nodejitsu:

var proxy = require('http-proxy').createProxyServer({});

app.use('/blog', function (req, res) {
  // You may need to edit req.url (or similar) to strip the /blog part of the url or ghost might not recognise it
  proxy.web(req, res, {
    target: 'http://127.0.0.1:'+GHOST_PORT
  });
});
person Evan Shortiss    schedule 08.07.2015
comment
Так это означает, что я должен запустить призрак в основном приложении? Я не могу просто содержать все это в приложении-призраке? - person Z2VvZ3Vp; 08.07.2015
comment
Это немного другое. Похоже, вы хотите прокси-запросы, поступающие в ваше основное приложение, к призраку? - person Evan Shortiss; 08.07.2015
comment
Я думаю, что да, это то, что я пытаюсь сделать. - person Z2VvZ3Vp; 08.07.2015
comment
Добавлено больше к ответу с примером прокси. - person Evan Shortiss; 08.07.2015