Přesměrování požadavků na jiný server
PROXY(prefix, target) přesměruje všechny požadavky pod prefixem URL na jiný server a odpověď streamuje zpět, takže jedna aplikace Total.js může stát před několika službami. Spouští se před trasami, takže prefix zpracovaný přes PROXY() se nikdy nedostane k ROUTE(). Požadavek se předá s metodou, hlavičkami a tělem; hlavičky x-forwarded-for, x-forwarded-url a x-forwarded-host informují cílový server o původním požadavku. PROXY(prefix) bez cíle proxy odstraní.
Objekt, který vrátí, proxy konfiguruje: .copy(type) určuje, která část cesty se pošle cíli (viz níže), .timeout(ms) omezuje čekání, .check(fn) způsobí, že se proxy uplatní jen tehdy, když fn(ctrl) vrátí true, a .before(uri, ctrl) může změnit odchozí požadavek, například přidat hlavičku.
.copy() přijímá none (výchozí), extend nebo replace. S none cíl dostane jen cestu cíle plus query string: /none/a/b/?q=1 se stane /base/?q=1 pro cíl http://host/base/. S extend se zbytek cesty požadavku připojí k cestě cíle: /extend/a/b/?q=1 se stane /base/a/b/?q=1, což je to, co chcete u brány. replace se chová jako extend, když má cíl vlastní cestu; pokud je cílem jen hostitel, pošle zbytek cesty bez query stringu, proto upřednostněte extend.
Pro jednu trasu použijte $.proxy(url): pošle aktuální požadavek (metodu, query string, tělo a hlavičky) na url a vrátí odpověď cíle s jejím stavovým kódem.
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/');
}