# Vidarebefordra förfrågningar till en annan server

> Använd PROXY() för att koppla ett URL-prefix till en uppströmsserver, välj hur sökvägen kopieras och $.proxy() för att vidarebefordra en enskild rutt.

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

`PROXY(prefix, target)` vidarebefordrar varje förfrågan under ett URL-prefix till en annan server och strömmar tillbaka svaret, så att en Total.js-applikation kan stå framför flera tjänster. Den körs före rutterna, så ett prefix som hanteras av `PROXY()` når aldrig `ROUTE()`. Förfrågan skickas vidare med sin metod, sina headers och sin body; headerna `x-forwarded-for`, `x-forwarded-url` och `x-forwarded-host` berättar för uppströmsservern om den ursprungliga förfrågan. `PROXY(prefix)` utan mål tar bort proxyn.

Objektet den returnerar konfigurerar proxyn: `.copy(type)` väljer vilken del av sökvägen som skickas uppströms (se nedan), `.timeout(ms)` begränsar väntetiden, `.check(fn)` gör att proxyn bara gäller när `fn(ctrl)` returnerar true och `.before(uri, ctrl)` kan ändra den utgående förfrågan, till exempel för att lägga till en header.

`.copy()` tar `none` (standard), `extend` eller `replace`. Med **`none`** får uppströmsservern bara målets sökväg plus query string: `/none/a/b/?q=1` blir `/base/?q=1` för målet `http://host/base/`. Med **`extend`** läggs resten av förfrågans sökväg till målets sökväg: `/extend/a/b/?q=1` blir `/base/a/b/?q=1`, vilket är vad du vill ha för en gateway. `replace` beter sig som `extend` när målet har en egen sökväg; när målet bara är en värd skickar den resten av sökvägen **utan query string**, så föredra `extend`.

För en enskild rutt använder du `$.proxy(url)`: den skickar den aktuella förfrågan (metod, query string, body och headers) till `url` och returnerar uppströmsserverns svar med dess statuskod.

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