Frage

Ich möchte in der Lage, mehrere NodeJS Anwendungen unter der gleichen Domain-Host, ohne Sub-Domains zu verwenden (wie google.com/reader statt images.google.com). Das Problem ist, dass ich immer den ersten Teil der URL zum Beispiel eingeben "/ Leser" in Express / NodeJS.

Wie kann ich einen Express App so einrichten, dass die Basis-URL ist something.com/myapp?

Also statt:

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

Ich kann tun:

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

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

Ich würde auch gerne configure Connect staticProvider die gleiche Art und Weise verhalten (jetzt ist die Vorgabe dienen statische Dateien zu something.com/js oder something.com/css statt something.com/myapp/js)

War es hilfreich?

Lösung

Im Moment dies nicht unterstützt wird, und es ist nicht einfach, es auf eigene Faust hinzuzufügen.

Die ganze Routing Sachen begraben liegt tief im Inneren des Server-Code, und als Bonus gibt es keine Exposition der Routen sie Selfs.

ich durch die Quelle gegraben und überprüft auch die neueste Version von Express und der Connect-Middleware, aber es gibt immer noch keine Unterstützung für eine solche Funktionalität, sollten Sie ein Problem öffnen entweder auf Connect oder Express selbst .

Inzwischen ...

Patch die Sache selbst, hier ist eine schnelle und einfache Art und Weise mit nur einer Zeile Code geändert.

In ~/.local/lib/node/.npm/express/1.0.0/package/lib/express/servers.js, suchen nach:

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

Dies sollte Linie 357 sein um, ersetzen, dass mit:

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

Nun fügen Sie einfach die Einstellung:

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

Dies funktioniert gut mit Pfaden, die Plain-Strings sind, für RegEx-Unterstützung müssen Sie in der Router-Middleware-Hack um sich selbst, besser Datei ein Problem in diesem Fall.

Was der statische Anbieter geht, nur in /mypapp hinzufügen, wenn Sie es einrichten.

Aktualisieren

mache es mit RegExp arbeitet auch:

// 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;
    }
}

ich dies nur mit einer Handvoll von Ausdrücken getestet, so dass diese nicht zu 100% getestet, aber in der Theorie sollte es funktionieren.

Update 2

ein Problem mit dem Patch abgelegt:
https://github.com/visionmedia/express/issues/issue/478

Andere Tipps

Der Express-Router kann diese handhaben, da 4.0

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

http://bulkan-evcimen.com/using_express_router_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);

Zurück Antwort (vor 4.0 Express):

Der Express-Namespace-Modul (tot) verwendet, um den Trick zu tun:

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

require('express-namespace');

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

Sie einfach den Thread zu aktualisieren, jetzt mit Express.js v4 Sie können es tun, ohne express-namespace mit:

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);

Cheers!

Ich konnte dies erreichen, mit einer Kombination von Express-Namespace für die Routen und ein Update von der untenen Diskussion Google-Gruppe für die statischen Vermögenswerte. Dieser Code-Schnipsel wird eine Anfrage an /foo/javascripts/jquery.js wie eine Anfrage an /javascripts/jquery.js behandeln:

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

Quelle: https://groups.google.com/forum/# ! msg / Express-js / xlP6_DX6he0 / 6OTY4hwfV-0J

Darüber hinaus gibt es Probleme mit der Zuverlässigkeit. Wenn die Zuverlässigkeit wichtig ist, ist eine gemeinsame Lösung, die ein Front-End-Reverse-HTTP-Proxy, wie nginx oder HAProxy zu verwenden. Sie verwenden beide Single-Thread-evented Architektur und sind somit sehr skalierbar.

Dann können Sie verschiedene Knoten Prozesse für verschiedene Unterseiten haben, und wenn ein Standort ausfällt (abgefangene Ausnahme, Speicherleck, Programmierer Fehler, was auch immer) der Rest von subsites zur Arbeit fortzusetzen.

Ich war auf der Suche für diese Funktion aber für die API-Routen, nicht für statische Dateien. Was ich tat, war, dass, wenn ich den Router initialisiert, habe ich den Pfad montieren. Also meine Konfiguration sieht wie folgt aus

//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, {});
    });
});

Beachten Sie die '/ api' beim Aufruf des Routers

Ich weiß, das ist eine sehr alte Frage, aber Express viel, da die meisten geändert hat diese Antworten gepostet so dass ich dachte, dass ich meinen Ansatz teilen würde.

Sie kann, natürlich, Verwendung Router mit Express 4 zu einer Gruppe zusammengehörige Funktionen hinter einem bestimmten Pfad. Dies ist gut dokumentiert und wird bereits von anderen Antworten abgedeckt.

Es ist jedoch auch möglich, die gesamte Anwendung auf einem bestimmten Pfad zu montieren. Als Beispiel nehmen wir an, unsere Anwendung (die wir Gastgeber in /myapp wollen) wie folgt aussieht, in einer Datei namens 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;

In unserer js Datei dann könnten wir montieren diese ganze Anwendung auf dem Weg /myapp:

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

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

app.listen(3000);

Beachten Sie, dass wir zwei Anwendungen hier erstellt haben, montiert auf der anderen. Die Hauptanwendung weitere Unter Anwendungen auf verschiedenen Wegen montiert je nach Bedarf.

haben könnte

Der Code in myapp.js ist völlig unabhängig davon, wo es angebracht war. Es ist ähnlich der Struktur der express-generator in dieser Hinsicht verwendet werden.

Ein Teil der Dokumentation über Sub-Apps finden Sie hier:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top