ForgeTotal.js 5
sv

Total.js 5

Vidarebefordra förfrågningar till en annan server

Total.js 5 · total5@0.0.19 proxygatewayintegrations Körd med Total.js 5

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.

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