Pour éviter les problèmes AJAX de même domaine, je veux que mon serveur Web node.js transfère toutes les demandes de l'URL /api/BLABLA
vers un autre serveur, par exemple other_domain.com:3000/BLABLA
, et renvoie à l'utilisateur la même chose que ce serveur distant a renvoyé, de manière transparente.
Toutes les autres URL (à côté /api/*
) doivent être servies directement, pas de proxy.
Comment puis-je y parvenir avec node.js + express.js? Pouvez-vous donner un exemple de code simple?
(le serveur Web et le 3000
serveur distant sont sous mon contrôle, tous deux exécutant node.js avec express.js)
Jusqu'à présent, j'ai trouvé cela https://github.com/http-party/node-http-proxy , mais la lecture de la documentation ne m'a pas rendu plus sage. J'ai fini avec
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
});
});
mais rien n'est retourné au serveur Web d'origine (ou à l'utilisateur final), donc pas de chance.
la source
Réponses:
Vous souhaitez utiliser
http.request
pour créer une demande similaire à l'API distante et renvoyer sa réponse.Quelque chose comme ça:
Remarque: je n'ai pas vraiment essayé ce qui précède, il peut donc contenir des erreurs d'analyse, j'espère que cela vous donnera un indice sur la façon de le faire fonctionner.
la source
Cannot render headers after they are sent to the client
Archiver
J'ai fait quelque chose de similaire mais j'ai utilisé la requête à la place:
J'espère que cela aide, il m'a fallu un certain temps pour réaliser que je pouvais le faire :)
la source
J'ai trouvé une solution plus courte et très simple qui fonctionne de manière transparente, et avec l'authentification également, en utilisant
express-http-proxy
:Et puis simplement:
Remarque: comme mentionné par @MaxPRafferty, utilisez
req.originalUrl
à la place debaseUrl
pour conserver la chaîne de requête:Mise à jour: Comme mentionné par Andrew (merci!), Il existe une solution toute faite utilisant le même principe:
Puis:
Documentation: http-proxy-middleware sur Github
Je sais que je suis en retard pour rejoindre cette fête, mais j'espère que cela aidera quelqu'un.
la source
Pour étendre la réponse de trigoman (tous les crédits à lui) pour travailler avec POST (pourrait aussi faire fonctionner avec PUT etc):
la source
if(req.method === 'PUT'){ r = request.put({uri: url, json: req.body}); }
J'ai utilisé la configuration suivante pour tout diriger
/rest
vers mon serveur principal (sur le port 8080), et toutes les autres demandes vers le serveur frontal (un serveur Webpack sur le port 3001). Il prend en charge toutes les méthodes HTTP, ne perd aucune méta-info de requête et prend en charge les websockets (dont j'ai besoin pour le rechargement à chaud)la source
Installez d'abord express et http-proxy-middleware
Puis dans votre server.js
Dans cet exemple, nous servons le site sur le port 3000, mais lorsqu'une requête se termine par / api, nous la redirigeons vers localhost: 8080.
http: // localhost: 3000 / api / login redirection vers http: // localhost: 8080 / api / login
la source
Ok, voici une réponse prête à copier-coller utilisant le module npm require ('request') et une variable d'environnement * au lieu d'un proxy codé en dur):
coffeescript
javascript:
la source
J'ai trouvé une solution plus courte qui fait exactement ce que je veux https://github.com/http-party/node-http-proxy
Après l'installation
http-proxy
Utilisez-le comme ci-dessous dans votre serveur / index / app.js
J'ai vraiment passé des jours à chercher partout pour éviter ce problème, j'ai essayé de nombreuses solutions et aucune d'entre elles n'a fonctionné à part celle-ci.
J'espère que cela aidera aussi quelqu'un d'autre :)
la source
Je n'ai pas d'échantillon express, mais un avec un
http-proxy
emballage simple . Une version très dépouillée du proxy que j'ai utilisé pour mon blog.En bref, tous les packages proxy http de nodejs fonctionnent au niveau du protocole http, et non au niveau tcp (socket). Ceci est également vrai pour les middlewares express et tous les middleware express. Aucun d'entre eux ne peut faire de proxy transparent, ni de NAT, ce qui signifie conserver l'adresse IP de la source du trafic entrant dans le paquet envoyé au serveur Web principal.
Cependant, le serveur Web peut récupérer l'adresse IP d'origine des en-têtes http x-forwarded et l'ajouter au journal.
La fonctionnalité d'
xfwd: true
enproxyOption
-tête in enable x-forward pourhttp-proxy
.Référence pour l'en-tête X-Forwarded: https://en.wikipedia.org/wiki/X-Forwarded-For
Version complète de mon proxy: https://github.com/J-Siu/ghost-https-nodejs-proxy
la source