Aby uniknąć problemów z AJAX tej samej domeny, chcę, aby mój serwer sieciowy node.js przekazywał na przykład wszystkie żądania z adresu URL /api/BLABLA
do innego serwera i w sposób przezroczysty zwracał other_domain.com:3000/BLABLA
użytkownikowi to samo, co ten zdalny serwer.
Wszystkie inne adresy URL (obok /api/*
) mają być obsługiwane bezpośrednio, bez proxy.
Jak to osiągnąć za pomocą node.js + express.js? Czy możesz podać prosty przykład kodu?
(zarówno serwer WWW, jak i serwer zdalny 3000
są pod moją kontrolą, oba działają na node.js z express.js)
Do tej pory znalazłem to https://github.com/http-party/node-http-proxy , ale przeczytanie tamtej dokumentacji nie uczyniło mnie mądrzejszym. Skończyło się
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
});
});
ale nic nie jest zwracane na oryginalny serwer sieciowy (ani do użytkownika końcowego), więc nie ma szczęścia.
źródło
Odpowiedzi:
Chcesz użyć,
http.request
aby utworzyć podobne żądanie do zdalnego interfejsu API i zwrócić jego odpowiedź.Coś takiego:
Uwaga: tak naprawdę nie wypróbowałem powyższego, więc może zawierać błędy analizy, mam nadzieję, że da ci to wskazówkę, jak sprawić, by działało.
źródło
Cannot render headers after they are sent to the client
Archiwum
Zrobiłem coś podobnego, ale zamiast tego użyłem request :
Mam nadzieję, że to pomoże, chwilę zajęło mi uświadomienie sobie, że mogę to zrobić :)
źródło
Znalazłem krótsze i bardzo proste rozwiązanie, które działa bezproblemowo, a także z uwierzytelnianiem, używając
express-http-proxy
:A potem po prostu:
Uwaga: jak wspomniano w @MaxPRafferty, użyj
req.originalUrl
zamiast,baseUrl
aby zachować querystring:Aktualizacja: Jak wspomniał Andrew (dziękuję!), Istnieje gotowe rozwiązanie działające na tej samej zasadzie:
I wtedy:
Dokumentacja: http-proxy-middleware na Github
Wiem, że spóźniłem się na przyjęcie, ale mam nadzieję, że to komuś pomoże.
źródło
Aby rozszerzyć odpowiedź trygomana (pełne kredyty dla niego) do pracy z POST (może również pracować z PUT itp.):
źródło
if(req.method === 'PUT'){ r = request.put({uri: url, json: req.body}); }
Użyłem następującej konfiguracji, aby skierować wszystko na
/rest
mój serwer zaplecza (na porcie 8080), a wszystkie inne żądania do serwera frontendu (serwer webpacka na porcie 3001). Obsługuje wszystkie metody HTTP, nie traci żadnych meta-informacji żądania i obsługuje gniazda sieciowe (których potrzebuję do ponownego ładowania na gorąco)źródło
Najpierw zainstaluj oprogramowanie pośrednie express i http-proxy-middleware
Następnie w pliku server.js
W tym przykładzie obsługujemy witrynę na porcie 3000, ale gdy żądanie kończy się na / api, przekierowujemy je na localhost: 8080.
http: // localhost: 3000 / api / login przekierowanie do http: // localhost: 8080 / api / login
źródło
OK, oto odpowiedź gotowa do skopiowania i wklejenia przy użyciu modułu require ('request') npm i zmiennej środowiskowej * zamiast zakodowanego na stałe serwera proxy):
skrypt kawowy
javascript:
źródło
Znalazłem krótsze rozwiązanie, które robi dokładnie to, czego chcę https://github.com/http-party/node-http-proxy
Po zainstalowaniu
http-proxy
Użyj go jak poniżej w swoim server / index / app.js
Naprawdę spędziłem dni szukając wszędzie, aby uniknąć tego problemu, wypróbowałem wiele rozwiązań i żadne z nich nie zadziałało, ale to jedno.
Mam nadzieję, że to pomoże też komuś innemu :)
źródło
Nie mam próbki ekspresowej, ale taką ze zwykłym
http-proxy
opakowaniem. Bardzo uproszczona wersja proxy, którego użyłem na swoim blogu.Krótko mówiąc, wszystkie pakiety proxy http nodejs działają na poziomie protokołu http, a nie tcp (gniazda). Dotyczy to również Express i wszystkich Express Middleware. Żaden z nich nie może wykonać przezroczystego proxy ani NAT, co oznacza przechowywanie adresu IP źródła ruchu przychodzącego w pakiecie wysyłanym do serwera WWW zaplecza.
Jednak serwer sieciowy może pobrać oryginalny adres IP z nagłówków http x-forwarded i dodać go do dziennika.
xfwd: true
WproxyOption
włączyć funkcję nagłówka X-forward dlahttp-proxy
.Odniesienie do nagłówka X-Forwarded: https://en.wikipedia.org/wiki/X-Forwarded-For
Pełna wersja mojego proxy: https://github.com/J-Siu/ghost-https-nodejs-proxy
źródło