# Препращане на заявки към друг сървър

> Използвайте PROXY(), за да свържете префикс на URL със сървър нагоре по веригата, изберете как се копира пътят и $.proxy(), за да препратите един маршрут.

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: bg
Content-SHA256: 5a2c52d1a76c53cf43eb55a742fcdd04ff7a5287557a30f0f3ce51a83176c2ab
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

`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` и връща отговора на сървъра нагоре по веригата с неговия статус код.

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