Redirecționează cereri către un alt server
PROXY(prefix, target) redirecționează către alt server toate cererile aflate sub un prefix de URL și returnează răspunsul în streaming, astfel încât o aplicație Total.js poate sta în fața mai multor servicii. Rulează înaintea rutelor, deci un prefix gestionat de PROXY() nu ajunge niciodată la ROUTE(). Cererea este transmisă cu metoda, antetele și corpul ei; antetele x-forwarded-for, x-forwarded-url și x-forwarded-host informează serverul din amonte despre cererea originală. PROXY(prefix) fără destinație elimină proxy-ul.
Obiectul returnat configurează proxy-ul: .copy(type) alege ce parte a căii este trimisă mai departe (vezi mai jos), .timeout(ms) limitează așteptarea, .check(fn) face ca proxy-ul să se aplice doar când fn(ctrl) returnează true, iar .before(uri, ctrl) poate modifica cererea de ieșire, de exemplu pentru a adăuga un antet.
.copy() acceptă none (implicit), extend sau replace. Cu none, serverul din amonte primește doar calea destinației plus query string-ul: /none/a/b/?q=1 devine /base/?q=1 pentru destinația http://host/base/. Cu extend, restul căii cererii se adaugă la calea destinației: /extend/a/b/?q=1 devine /base/a/b/?q=1, ceea ce îți dorești pentru un gateway. replace se comportă ca extend când destinația are o cale proprie; când destinația este doar un host, trimite restul căii fără query string, așa că preferă extend.
Pentru o singură rută folosește $.proxy(url): trimite cererea curentă (metodă, query string, corp și antete) către url și returnează răspunsul serverului din amonte cu codul lui de stare.
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/');
}