Untuk menghindari masalah AJAX dengan domain yang sama, saya ingin server web node.js saya meneruskan semua permintaan dari URL /api/BLABLA
ke server lain, misalnya other_domain.com:3000/BLABLA
, dan mengembalikan kepada pengguna hal yang sama dengan yang dilakukan oleh server jauh ini, secara transparan.
Semua URL lain (di sebelah /api/*
) harus dilayani secara langsung, tanpa proxy.
Bagaimana cara mencapai ini dengan node.js + express.js? Bisakah Anda memberikan contoh kode sederhana?
(server web dan server jarak jauh 3000
berada di bawah kendali saya, keduanya menjalankan node.js dengan express.js)
Sejauh ini saya menemukan ini https://github.com/http-party/node-http-proxy , tetapi membaca dokumentasi di sana tidak membuat saya lebih bijak. Saya berakhir dengan
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
});
});
tetapi tidak ada yang dikembalikan ke server web asli (atau ke pengguna akhir), jadi tidak berhasil.
sumber
Jawaban:
Anda ingin menggunakan
http.request
untuk membuat permintaan serupa ke API jarak jauh dan mengembalikan responsnya.Sesuatu seperti ini:
Perhatikan: Saya belum benar-benar mencoba hal di atas, jadi mungkin berisi kesalahan parse semoga ini akan memberi Anda petunjuk tentang cara membuatnya bekerja.
sumber
Cannot render headers after they are sent to the client
Arsipkan
Saya melakukan sesuatu yang serupa tetapi saya menggunakan permintaan :
Saya harap ini membantu, butuh beberapa saat untuk menyadari bahwa saya bisa melakukan ini :)
sumber
Saya menemukan solusi yang lebih singkat dan sangat langsung yang bekerja dengan mulus, dan dengan otentikasi juga, menggunakan
express-http-proxy
:Dan kemudian secara sederhana:
Catatan: seperti yang disebutkan oleh @MaxPRafferty, penggunaan
req.originalUrl
di tempatbaseUrl
untuk melestarikan querystring:Pembaruan: Seperti yang disebutkan oleh Andrew (terima kasih!), Ada solusi yang sudah jadi menggunakan prinsip yang sama:
Lalu:
Dokumentasi: http-proxy-middleware di Github
Saya tahu saya terlambat untuk bergabung dengan pesta ini, tapi saya harap ini membantu seseorang.
sumber
Untuk memperluas jawaban trigoman (kredit penuh kepadanya) untuk bekerja dengan POST (bisa juga bekerja dengan PUT dll):
sumber
if(req.method === 'PUT'){ r = request.put({uri: url, json: req.body}); }
Saya menggunakan pengaturan berikut untuk mengarahkan semuanya
/rest
ke server backend saya (pada port 8080), dan semua permintaan lainnya ke server frontend (server webpack pada port 3001). Ini mendukung semua metode HTTP, tidak kehilangan meta-info permintaan, dan mendukung soket web (yang saya perlukan untuk memuat ulang panas)sumber
Pertama instal express dan http-proxy-middleware
Kemudian di server.js Anda
Dalam contoh ini kami melayani situs pada port 3000, tetapi ketika permintaan diakhiri dengan / api, kami mengarahkannya ke localhost: 8080.
http: // localhost: 3000 / api / login redirect ke http: // localhost: 8080 / api / login
sumber
Ok, inilah jawaban siap-salin-tempel menggunakan modul npm ((permintaan ')) dan variabel lingkungan * alih-alih proxy yang dikodekan dengan hardcoded):
naskah kopi
javascript:
sumber
Saya menemukan solusi lebih pendek yang melakukan apa yang saya inginkan https://github.com/http-party/node-http-proxy
Setelah menginstal
http-proxy
Gunakan seperti di bawah ini di server / index / app.js Anda
Saya benar-benar telah menghabiskan waktu berhari-hari mencari kemana-mana untuk menghindari masalah ini, mencoba banyak solusi dan tidak ada yang berhasil kecuali yang ini.
Semoga ini akan membantu orang lain juga :)
sumber
Saya tidak punya sampel ekspres, tapi satu dengan
http-proxy
paket polos . Versi proxy yang sangat saya gunakan untuk blog saya.Singkatnya, semua paket proksi nodejs http bekerja pada level protokol http, bukan level tcp (socket). Ini juga berlaku untuk express dan semua middleware ekspres. Tak satu pun dari mereka dapat melakukan proxy transparan, atau NAT, yang berarti menjaga IP sumber lalu lintas masuk dalam paket yang dikirim ke server web backend.
Namun, server web dapat mengambil IP asli dari http x-forwarded header dan menambahkannya ke dalam log.
The
xfwd: true
dalamproxyOption
mengaktifkan fitur sundulan x-maju untukhttp-proxy
.Referensi untuk Header X-Forwarded: https://en.wikipedia.org/wiki/X-Forwarded-For
Versi lengkap dari proxy saya: https://github.com/J-Siu/ghost-https-nodejs-proxy
sumber