Можно ли установить базовый URL для приложения Nodejs?

StackOverflow https://stackoverflow.com/questions/4375554

  •  09-10-2019
  •  | 
  •  

Вопрос

Я хочу иметь возможность размещать несколько приложений Nodejs под тем же доменом, без использования подгруппов (например, Google.com/Reader вместо изображений. Google.com). Проблема в том, что я всегда печатаю первую часть URL EG, например, «/ Reader» в Express / Nodejs.

Как я могу установить приложение Express так, чтобы базовый URL something.com/myapp?

Итак вместо:

app.get("/myapp", function (req, res) {
   // can be accessed from something.com/myapp
});

Я могу сделать:

// Some set-up
app.base = "/myapp"

app.get("/", function (req, res) {
   // can still be accessed from something.com/myapp
});

Я также хотел бы настроить StaticProvider Connect, чтобы вести себя так же (прямо сейчас по умолчанию для обслуживания статических файлов something.com/js или something.com/css вместо something.com/myapp/js)

Это было полезно?

Решение

На данный момент это не поддерживается, и нелегко добавлять его самостоятельно.

Весь материал маршрутизации глубоко погружается в серверный код, и в качестве бонуса нет экспозиции маршрутов их самосвалы.

Я выкопал исходный код, а также проверил последнюю версию экспресс и промежуточного программного обеспечения Connect, но все еще нет поддержки для таких функций, вы должны открыть проблему на Соединять или Выражать сам.

Тем временем...

Патч Ведь сами, вот быстрый и простой способ с изменением только одной строки кода.

В ~/.local/lib/node/.npm/express/1.0.0/package/lib/express/servers.js, ищи:

// Generate the route
this.routes[method](path, fn);

Это должно быть вокруг линии 357, заменить это с:

// Generate the route
this.routes[method](((self.settings.base || '') + path), fn);

Теперь просто добавьте настройку:

app.set('base', '/myapp');

Это работает нормально с путями, которые являются простыми строками, для поддержки Regex вам придется взломать в маршрутизаторе Farmware самостоятельно, лучше подать проблему в этом случае.

Что касается статического провайдера, просто добавьте в /mypapp при настройке его.

Обновлять

Сделал его работать с Regexp тоже:

// replace
this.routes[method](baseRoute(self.settings.base || '', path), fn);

// helper
function baseRoute(base, path) {
    if (path instanceof RegExp) {
        var exp = RegExp(path).toString().slice(1, -1);
        return new RegExp(exp[0] === '^' ? '^' + base + exp.substring(1) : base + exp);

    } else {
        return (base || '') + path;
    }
}

Я проверил это только с несколькими выражениями, поэтому это не на 100%, а теоретически это должно работать.

Обновление 2.

Подал проблему с патчем:
https://github.com/visionmedia/express/issues/issue/478.

Другие советы

Маршрутизатор Express может обрабатывать это с 4,0

http://expressjs.com/en/api.html#roter.

http://bulkan-evcimen.com/using_express_roouter_instead_of_express_namespace.html.

var express = require('express');
var app = express();
var router = express.Router();

// simple logger for this router's requests
// all requests to this router will first hit this middleware
router.use(function(req, res, next) {
  console.log('%s %s %s', req.method, req.url, req.path);
  next();
});

// this will only be invoked if the path ends in /bar
router.use('/bar', function(req, res, next) {
  // ... maybe some additional /bar logging ...
  next();
});

// always invoked
router.use(function(req, res, next) {
  res.send('Hello World');
});

app.use('/foo', router);

app.listen(3000);

Предыдущий ответ (до экспресса 4.0):

Модуль экспресс-пространства имен (Dead Now) используется для выполнения хитрости:

https://github.com/visionmedia/express-anceSace.

require('express-namespace');

app.namespace('/myapp', function() {
        app.get('/', function (req, res) {
           // can be accessed from something.com/myapp
        });
});

Просто обновить нить, сейчас с Express.js V4. Вы можете сделать это без использования express-namespace:

var express = require('express'),
    forumRouter = express.Router(),
    threadRouter = express.Router(),
    app = express();

forumRouter.get('/:id)', function(req, res){
  res.send('GET forum ' + req.params.id);
});

forumRouter.get('/:id/edit', function(req, res){
  res.send('GET forum ' + req.params.id + ' edit page');
});


forumRouter.delete('/:id', function(req, res){
  res.send('DELETE forum ' + req.params.id);
});

app.use('/forum', forumRouter);

threadRouter.get('/:id/thread/:tid', function(req, res){
  res.send('GET forum ' + req.params.id + ' thread ' + req.params.tid);
});

forumRouter.use('/', threadRouter);

app.listen(app.get("port") || 3000);

Ваше здоровье!

Я смог добиться этого, используя комбинацию экспресс-пространства имен для маршрутов и исправления от приведенной ниже дискуссии Google Group для статических активов. Этот фрагмент будет лечить запрос на /foo/javascripts/jquery.js, как запрос на /javascripts/jquery.js:

app.use('/foo', express.static(__dirname + '/public'));

Источник: https://groups.google.com/forum/#!msg/express-js/xlp6_dx6he0/6oty4hwfv-0j.

Есть также проблемы надежности. Если важно надежность, общее решение является использование передового обратного прокси-сервера, такого как nginx или haproxy. Они оба используют однопоточную совокупную архитектуру и поэтому очень масштабируются.

Тогда у вас могут быть разные процессы узла для разных подведений, и если один сайт не удается (неисправный исключений, утечка памяти, ошибка программиста, что угодно) остальные подсчитыми сайтами продолжают работать.

Я искал эту функцию, но для маршрутов 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» при вызове маршрутизатора

Я знаю, что это очень старый вопрос, но экспресс много изменился, так как большинство этих ответов были размещены, поэтому я подумал, что поделился своим подходом.

Конечно, вы можете использовать маршрутизаторы с Express 4, чтобы объединить связанные функциональные возможности для конкретного пути. Это хорошо документировано и уже охвачено другими ответами.

Однако также можно установить целое приложение на определенном пути. В качестве примера давайте предположим, что наше приложение (тот, который мы хотим провести в /myapp) Похоже, в файле называется myapp.js:

var express = require('express'),
    path = require('path'),
    app = express();

app.use(express.static(path.join(__dirname, 'public')));

app.get('/hello', function(req, res) {
    res.send('Hello');
});

// Lots of other stuff here

exports.app = app;

В нашем главном файле JS мы можем затем монтировать все это приложение на пути /myapp:

var express = require('express'),
    app = express(),
    myApp = require('./myapp').app;

app.use('/myapp', myApp);

app.listen(3000);

Обратите внимание, что мы создали два приложения здесь, одна установленная на другом. Основное приложение может иметь дополнительные подпассы, установленные на разных путях по мере необходимости.

Код включен myapp.js полностью не зависит от того, где он был установлен. Это похоже на структуру, используемую express-generator в этом отношении.

Некоторая документация о подпоследовательных приложениях можно найти здесь:

https://expressjs.com/en/4x/api.html#app.mountpath. https://expressjs.com/en/4x/api.html#app.onmount.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top