ForgeTotal.js 5
sk

Total.js 5

Presmerovanie požiadaviek na iný server

Total.js 5 · total5@0.0.19 proxygatewayintegrations Spustené s Total.js 5

PROXY(prefix, target) presmeruje všetky požiadavky pod prefixom URL na iný server a odpoveď streamuje späť, takže jedna aplikácia Total.js môže stáť pred viacerými službami. Spúšťa sa pred trasami, takže prefix spracovaný cez PROXY() sa nikdy nedostane k ROUTE(). Požiadavka sa odovzdá s metódou, hlavičkami a telom; hlavičky x-forwarded-for, x-forwarded-url a x-forwarded-host informujú cieľový server o pôvodnej požiadavke. PROXY(prefix) bez cieľa proxy odstráni.

Objekt, ktorý vráti, proxy konfiguruje: .copy(type) určuje, ktorá časť cesty sa pošle cieľu (pozri nižšie), .timeout(ms) obmedzuje čakanie, .check(fn) spôsobí, že sa proxy uplatní len vtedy, keď fn(ctrl) vráti true, a .before(uri, ctrl) môže zmeniť odchádzajúcu požiadavku, napríklad pridať hlavičku.

.copy() prijíma none (predvolené), extend alebo replace. S none cieľ dostane len cestu cieľa plus query string: /none/a/b/?q=1 sa stane /base/?q=1 pre cieľ http://host/base/. S extend sa zvyšok cesty požiadavky pripojí k ceste cieľa: /extend/a/b/?q=1 sa stane /base/a/b/?q=1, čo je to, čo chcete pri bráne. replace sa správa ako extend, keď má cieľ vlastnú cestu; ak je cieľom len hostiteľ, pošle zvyšok cesty bez query stringu, preto uprednostnite extend.

Pre jednu trasu použite $.proxy(url): pošle aktuálnu požiadavku (metódu, query string, telo a hlavičky) na url a vráti odpoveď cieľa s jej stavovým kódom.

controllers/proxy.js
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/');
}