Kérések továbbítása másik szerverre
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.
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/');
}