Препращане на заявки към друг сървър
PROXY(prefix, target) препраща към друг сървър всяка заявка под префикс на URL и връща отговора като поток, така че едно приложение на Total.js може да стои пред няколко услуги. Изпълнява се преди маршрутите, така че префикс, обработен от PROXY(), никога не стига до ROUTE(). Заявката се предава с метода, хедърите и тялото си; хедърите x-forwarded-for, x-forwarded-url и x-forwarded-host уведомяват сървъра нагоре по веригата за оригиналната заявка. PROXY(prefix) без цел премахва прокси.
Върнатият обект конфигурира прокси: .copy(type) избира коя част от пътя се изпраща нагоре (вж. по-долу), .timeout(ms) ограничава чакането, .check(fn) прави прокси да се прилага само когато fn(ctrl) върне true, а .before(uri, ctrl) може да промени изходящата заявка, например за да добави хедър.
.copy() приема none (по подразбиране), extend или replace. С none сървърът нагоре получава само пътя на целта плюс query string: /none/a/b/?q=1 става /base/?q=1 за целта http://host/base/. С extend остатъкът от пътя на заявката се добавя към пътя на целта: /extend/a/b/?q=1 става /base/a/b/?q=1, което е точно за шлюз. replace се държи като extend, когато целта има собствен път; когато целта е само хост, изпраща остатъка от пътя без query string, затова предпочитайте extend.
За един-единствен маршрут използвайте $.proxy(url): изпраща текущата заявка (метод, query string, тяло и хедъри) към url и връща отговора на сървъра нагоре по веригата с неговия статус код.
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/');
}