Przekazuj żądania do innego serwera
PROXY(prefix, target) przekazuje na inny serwer każde żądanie pod prefiksem URL i strumieniuje odpowiedź z powrotem, dzięki czemu jedna aplikacja Total.js może stać przed kilkoma usługami. Działa przed trasami, więc prefiks obsłużony przez PROXY() nigdy nie dociera do ROUTE(). Żądanie jest przekazywane z metodą, nagłówkami i ciałem; nagłówki x-forwarded-for, x-forwarded-url i x-forwarded-host informują serwer docelowy o oryginalnym żądaniu. PROXY(prefix) bez celu usuwa proxy.
Zwrócony obiekt konfiguruje proxy: .copy(type) wybiera, która część ścieżki jest wysyłana dalej (zob. niżej), .timeout(ms) ogranicza czas oczekiwania, .check(fn) sprawia, że proxy działa tylko wtedy, gdy fn(ctrl) zwróci true, a .before(uri, ctrl) może zmienić żądanie wychodzące, na przykład dodać nagłówek.
.copy() przyjmuje none (domyślnie), extend lub replace. Z none serwer docelowy otrzymuje tylko ścieżkę celu plus query string: /none/a/b/?q=1 staje się /base/?q=1 dla celu http://host/base/. Z extend reszta ścieżki żądania jest doklejana do ścieżki celu: /extend/a/b/?q=1 staje się /base/a/b/?q=1, czyli tym, czego potrzebujesz w bramie. replace zachowuje się jak extend, gdy cel ma własną ścieżkę; gdy celem jest sam host, wysyła resztę ścieżki bez query stringu, więc preferuj extend.
Dla pojedynczej trasy użyj $.proxy(url): wysyła bieżące żądanie (metodę, query string, ciało i nagłówki) na url i zwraca odpowiedź serwera docelowego z jej kodem statusu.
const Http = require('http');
// A small upstream server that reports what it received
Http.createServer(function(req, res) {
res.writeHead(200, { 'content-type': 'application/json' });
res.end(JSON.stringify({ method: req.method, url: req.url, token: req.headers['x-token'] || null, forwarded: !!req.headers['x-forwarded-url'] }));
}).listen(9411, '127.0.0.1');
// One proxy per copy mode, to see the difference (the target has the path /base/)
PROXY('/none/', 'http://127.0.0.1:9411/base/');
PROXY('/extend/', 'http://127.0.0.1:9411/base/').copy('extend');
PROXY('/plain/', 'http://127.0.0.1:9411/base/').copy('replace');
// Everything below /service/ goes to the upstream, and a header is added on the way
PROXY('/service/', 'http://127.0.0.1:9411/').copy('extend').before(function(uri, ctrl) {
uri.headers['x-token'] = 'secret';
});
exports.install = function() {
ROUTE('GET /single/', single);
};
function single($) {
$.proxy('http://127.0.0.1:9411/from-route/');
}