ForgeTotal.js 5
hu

Total.js 5

Kérések továbbítása másik szerverre

Total.js 5 · total5@0.0.19 proxygatewayintegrations Total.js 5-tel lefuttatva

A PROXY(prefix, target) egy URL-előtag alatti minden kérést továbbít egy másik szerverre, és visszastreameli a választ, így egy Total.js-alkalmazás több szolgáltatás előtt állhat. Az útvonalak előtt fut, ezért egy PROXY() által kezelt előtag sosem ér el a ROUTE()-ig. A kérés a metódusával, fejléceivel és törzsével megy tovább; az x-forwarded-for, x-forwarded-url és x-forwarded-host fejlécek tájékoztatják az upstreamet az eredeti kérésről. A cél nélküli PROXY(prefix) eltávolítja a proxyt.

A visszaadott objektum a proxyt konfigurálja: a .copy(type) választja ki, hogy az útvonal mely része megy az upstreamnek (lásd lent), a .timeout(ms) korlátozza a várakozást, a .check(fn) azt éri el, hogy a proxy csak akkor érvényesüljön, ha az fn(ctrl) true-t ad, a .before(uri, ctrl) pedig módosíthatja a kimenő kérést, például fejlécet adhat hozzá.

A .copy() a none (alapértelmezett), az extend vagy a replace értéket fogadja. A none esetén az upstream csak a cél útvonalát és a query stringet kapja: a /none/a/b/?q=1 a http://host/base/ célnál /base/?q=1 lesz. Az extend esetén a kérés útvonalának maradéka hozzáfűződik a cél útvonalához: a /extend/a/b/?q=1 /base/a/b/?q=1 lesz, ami egy átjárónál kell. A replace úgy viselkedik, mint az extend, ha a célnak saját útvonala van; ha a cél csak egy host, az útvonal maradékát a query string nélkül küldi, ezért az extend-et részesítsd előnyben.

Egyetlen útvonalra használd a $.proxy(url)-t: a jelenlegi kérést (metódus, query string, törzs és fejlécek) az url-re küldi, és az upstream válaszát adja vissza az állapotkódjával együtt.

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/');
}