Para evitar problemas de AJAX no mesmo domínio, desejo que meu servidor da web node.js. encaminhe todas as solicitações da URL /api/BLABLA
para outro servidor, por exemplo other_domain.com:3000/BLABLA
, e retorne ao usuário a mesma coisa que esse servidor remoto retornou de forma transparente.
Todos os outros URLs (ao lado /api/*
) devem ser veiculados diretamente, sem proxy.
Como conseguir isso com o node.js + express.js? Você pode dar um exemplo de código simples?
(o servidor da Web e o 3000
servidor remoto estão sob meu controle, ambos executando o node.js com o express.js)
Até agora, encontrei este https://github.com/http-party/node-http-proxy , mas ler a documentação lá não me deixou mais sábio. Acabei com
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
});
});
mas nada é retornado ao servidor Web original (ou ao usuário final), portanto, não há sorte.
fonte
Respostas:
Você deseja usar
http.request
para criar uma solicitação semelhante à API remota e retornar sua resposta.Algo assim:
Aviso: eu realmente não tentei o acima, por isso pode conter erros de análise, espero que isso lhe dê uma dica de como fazê-lo funcionar.
fonte
Cannot render headers after they are sent to the client
Arquivo
Fiz algo semelhante, mas usei request :
Espero que isso ajude, demorei um pouco para perceber que eu poderia fazer isso :)
fonte
Encontrei uma solução mais curta e direta que funciona perfeitamente e com autenticação, usando
express-http-proxy
:E então simplesmente:
Nota: conforme mencionado por @MaxPRafferty, use
req.originalUrl
no lugar debaseUrl
para preservar a string de consulta :Atualização: Como mencionado por Andrew (obrigado!), Há uma solução pronta usando o mesmo princípio:
E depois:
Documentação: http-proxy-middleware no Github
Sei que estou atrasado para participar desta festa, mas espero que isso ajude alguém.
fonte
Para estender a resposta do trigoman (créditos completos para ele) para trabalhar com o POST (também pode funcionar com o PUT, etc.):
fonte
if(req.method === 'PUT'){ r = request.put({uri: url, json: req.body}); }
Usei a seguinte configuração para direcionar tudo
/rest
para o servidor back-end (na porta 8080) e todas as outras solicitações ao servidor front-end (um servidor webpack na porta 3001). Ele suporta todos os métodos HTTP, não perde nenhuma meta-informação de solicitação e suporta websockets (que eu preciso para recarregar a quente)fonte
Primeiro instale express e http-proxy-middleware
Em seguida, no seu server.js
Neste exemplo, servimos o site na porta 3000, mas quando uma solicitação termina com / api, a redirecionamos para localhost: 8080.
http: // localhost: 3000 / api / login redirecione para http: // localhost: 8080 / api / login
fonte
Ok, aqui está uma resposta pronta para copiar e colar usando o módulo require ('request') npm e uma variável de ambiente * em vez de um proxy codificado):
coffeescript
javascript:
fonte
Encontrei uma solução mais curta que faz exatamente o que eu quero https://github.com/http-party/node-http-proxy
Depois de instalar
http-proxy
Use-o como abaixo em seu server / index / app.js
Eu realmente passei dias procurando em todos os lugares para evitar esse problema, tentei muitas soluções e nenhuma delas funcionou além desta.
Espero que ajude alguém também :)
fonte
Não tenho uma amostra expressa, mas uma com
http-proxy
embalagem simples . Uma versão simplificada do proxy que usei no meu blog.Em resumo, todos os pacotes proxy proxy nodejs funcionam no nível do protocolo http, não no nível tcp (soquete). Isso também se aplica ao middleware expresso e a todos os expressos. Nenhum deles pode fazer proxy transparente, nem NAT, o que significa manter o IP da origem do tráfego de entrada no pacote enviado ao servidor da web de back-end.
No entanto, o servidor da Web pode coletar o IP original de cabeçalhos http x encaminhados e adicioná-lo ao log.
O recurso
xfwd: true
inproxyOption
enable x-forward header parahttp-proxy
.Referência para o cabeçalho X-Forwarded: https://en.wikipedia.org/wiki/X-Forwarded-For
Versão completa do meu proxy: https://github.com/J-Siu/ghost-https-nodejs-proxy
fonte