Чтобы избежать проблем с AJAX в одном домене, я хочу, чтобы мой веб-сервер node.js /api/BLABLA
, например other_domain.com:3000/BLABLA
, перенаправлял все запросы с URL-адреса на другой сервер и возвращал пользователю то же, что и этот удаленный сервер, прозрачно.
Все остальные URL (кроме /api/*
) должны обслуживаться напрямую, без прокси.
Как мне добиться этого с помощью node.js + express.js? Можете ли вы привести простой пример кода?
(и веб-сервер, и удаленный 3000
сервер находятся под моим контролем, оба работают под управлением node.js с express.js)
До сих пор я нашел этот https://github.com/http-party/node-http-proxy , но чтение документации там не сделало меня мудрее. Я закончил с
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
});
});
но ничего не возвращается на исходный веб-сервер (или конечному пользователю), так что не повезло.
источник
Ответы:
Вы хотите использовать
http.request
для создания аналогичного запроса к удаленному API и возврата его ответа.Что-то вроде этого:
Обратите внимание: я на самом деле не пробовал вышеизложенное, поэтому оно может содержать ошибки разбора, надеюсь, это даст вам подсказку о том, как заставить его работать.
источник
Cannot render headers after they are sent to the client
Архив
Я сделал нечто подобное, но вместо этого я использовал запрос :
Надеюсь, это поможет, мне понадобилось время, чтобы понять, что я могу сделать это :)
источник
Я нашел более короткое и очень простое решение, которое работает без проблем, а также с аутентификацией, используя
express-http-proxy
:А потом просто:
Примечание: как упомянуто @MaxPRafferty, используйте
req.originalUrl
вместоbaseUrl
чтобы сохранить строку запроса:Обновление: Как упомянул Эндрю (спасибо!), Есть готовое решение, использующее тот же принцип:
А потом:
Документация: http-proxy-middleware на Github
Я знаю, что опоздал на вечеринку, но надеюсь, это кому-нибудь поможет.
источник
Чтобы распространить ответ тригомана (полные кредиты ему) на работу с POST (может также работать с PUT и т. Д.):
источник
if(req.method === 'PUT'){ r = request.put({uri: url, json: req.body}); }
Я использовал следующую настройку, чтобы направить все на
/rest
свой внутренний сервер (на порт 8080) и все остальные запросы на внешний сервер (сервер веб-пакетов на порт 3001). Он поддерживает все HTTP-методы, не теряет метаинформацию запроса и поддерживает веб-сокеты (которые мне нужны для горячей перезагрузки)источник
Сначала установите экспресс и http-proxy-middleware
Тогда в вашем server.js
В этом примере мы обслуживаем сайт через порт 3000, но когда запрос заканчивается на / api, мы перенаправляем его на localhost: 8080.
http: // localhost: 3000 / api / login перенаправить на http: // localhost: 8080 / api / login
источник
Хорошо, вот готовый к копированию и вставке ответ, использующий модуль require ('request') npm и переменную окружения * вместо жестко заданного прокси):
CoffeeScript
JavaScript:
источник
Я нашел более короткое решение, которое делает именно то, что я хочу, https://github.com/http-party/node-http-proxy
После установки
http-proxy
Используйте это как ниже в вашем сервере / index / app.js
Я действительно провел дни, ища повсюду, чтобы избежать этой проблемы, перепробовал множество решений, и ни одно из них не сработало, кроме этого.
Надеюсь, это поможет кому-то еще :)
источник
У меня нет экспресс-образца, но есть простой
http-proxy
пакет. Очень урезанная версия прокси, которую я использовал для своего блога.Короче говоря, все http прокси-пакеты nodejs работают на уровне протокола http, а не на уровне tcp (сокета). Это также верно для экспресс и всего промежуточного программного обеспечения. Ни один из них не может использовать прозрачный прокси-сервер или NAT, что означает сохранение IP-адреса источника входящего трафика в пакете, отправляемом на внутренний веб-сервер.
Однако веб-сервер может получить исходный IP-адрес из заголовков http x-forwarded и добавить его в журнал.
Функция заголовка
xfwd: true
in-proxyOption
x-forward дляhttp-proxy
.Ссылка для X-Forwarded Header: https://en.wikipedia.org/wiki/X-Forwarded-For
Полная версия моего прокси: https://github.com/J-Siu/ghost-https-nodejs-proxy
источник