Um AJAX-Probleme mit derselben Domäne zu vermeiden, möchte ich, dass mein node.js-Webserver beispielsweise alle Anforderungen von der URL /api/BLABLA
an einen anderen Server weiterleitet other_domain.com:3000/BLABLA
und dem Benutzer das gleiche zurückgibt, das dieser Remote-Server transparent zurückgegeben hat.
Alle anderen URLs (neben /api/*
) sollen direkt ohne Proxy bereitgestellt werden.
Wie erreiche ich das mit node.js + express.js? Können Sie ein einfaches Codebeispiel geben?
(Sowohl der Webserver als auch der Remote- 3000
Server stehen unter meiner Kontrolle. Beide führen node.js mit express.js aus.)
Bisher habe ich diese https://github.com/http-party/node-http-proxy gefunden , aber das Lesen der Dokumentation dort hat mich nicht klüger gemacht. Ich endete mit
var proxy = new httpProxy.RoutingProxy();
app.all("/api/*", function(req, res) {
console.log("old request url " + req.url)
req.url = '/' + req.url.split('/').slice(2).join('/'); // remove the '/api' part
console.log("new request url " + req.url)
proxy.proxyRequest(req, res, {
host: "other_domain.com",
port: 3000
});
});
Es wird jedoch nichts an den ursprünglichen Webserver (oder an den Endbenutzer) zurückgegeben, also kein Glück.
quelle
Antworten:
Sie möchten
http.request
eine ähnliche Anforderung für die Remote-API erstellen und deren Antwort zurückgeben.Etwas wie das:
Hinweis: Ich habe das oben Genannte nicht wirklich ausprobiert, daher kann es zu Analysefehlern kommen, die Ihnen hoffentlich einen Hinweis geben, wie Sie es zum Laufen bringen können.
quelle
Cannot render headers after they are sent to the client
Archiv
Ich habe etwas Ähnliches gemacht, aber stattdessen die Anfrage verwendet:
Ich hoffe das hilft, es hat eine Weile gedauert, bis mir klar wurde, dass ich das schaffen kann :)
quelle
Ich fand eine kürzere und sehr einfache Lösung , die auch nahtlos und mit Authentifizierung arbeitet, mit
express-http-proxy
:Und dann einfach:
Hinweis: Wie von @MaxPRafferty erwähnt, verwenden Sie
req.originalUrl
anstelle vonbaseUrl
, um den Querystring zu erhalten:Update: Wie von Andrew erwähnt (danke!), Gibt es eine fertige Lösung nach dem gleichen Prinzip:
Und dann:
Dokumentation: http-proxy-middleware auf Github
Ich weiß, dass ich zu spät bin, um an dieser Party teilzunehmen, aber ich hoffe, das hilft jemandem.
quelle
Um die Antwort von Trigoman (volle Credits an ihn) auf die Arbeit mit POST auszudehnen (könnte auch die Arbeit mit PUT usw. machen):
quelle
if(req.method === 'PUT'){ r = request.put({uri: url, json: req.body}); }
Ich habe das folgende Setup verwendet, um alles an
/rest
meinen Backend-Server (an Port 8080) und alle anderen Anforderungen an den Frontend-Server (einen Webpack-Server an Port 3001) weiterzuleiten. Es unterstützt alle HTTP-Methoden, verliert keine Anforderungs-Metainformationen und unterstützt Websockets (die ich zum Hot-Reloading benötige).quelle
Installieren Sie zuerst Express und http-Proxy-Middleware
Dann in Ihrer server.js
In diesem Beispiel wird die Site auf Port 3000 bereitgestellt. Wenn eine Anforderung jedoch mit / api endet, leiten wir sie an localhost um: 8080.
http: // localhost: 3000 / api / login Weiterleiten an http: // localhost: 8080 / api / login
quelle
Ok, hier ist eine Antwort zum Kopieren und Einfügen mit dem erforderlichen npm-Modul ('request') und einer Umgebungsvariablen * anstelle eines fest codierten Proxys:
Kaffeeskript
Javascript:
quelle
Ich habe eine kürzere Lösung gefunden, die genau das tut, was ich will: https://github.com/http-party/node-http-proxy
Nach der Installation
http-proxy
Verwenden Sie es wie unten in Ihrem Server / Index / App.js.
Ich habe wirklich tagelang überall gesucht, um dieses Problem zu vermeiden, habe viele Lösungen ausprobiert und keine davon hat funktioniert, außer dieser.
Hoffe, es wird auch jemand anderem helfen :)
quelle
Ich habe kein Expressmuster, aber eines mit einfachem
http-proxy
Paket. Eine sehr abgespeckte Version des Proxys, den ich für mein Blog verwendet habe.Kurz gesagt, alle http-Proxy-Pakete von nodejs arbeiten auf der http-Protokollebene und nicht auf der TCP-Ebene (Socket). Dies gilt auch für Express- und alle Express-Middleware. Keiner von ihnen kann einen transparenten Proxy oder NAT ausführen, was bedeutet, dass die IP-Adresse des eingehenden Datenverkehrs in dem an den Backend-Webserver gesendeten Paket erhalten bleibt.
Der Webserver kann jedoch die ursprüngliche IP-Adresse von HTTP-X-Forwarded-Headern abrufen und dem Protokoll hinzufügen.
Die Funktion
xfwd: true
zumproxyOption
Aktivieren des X-Forward-Headers fürhttp-proxy
.Referenz für X-Forwarded Header: https://en.wikipedia.org/wiki/X-Forwarded-For
Vollversion meines Proxys: https://github.com/J-Siu/ghost-https-nodejs-proxy
quelle