ForgeTotal.js 5
nl

Total.js 5

Verzoeken doorsturen naar een andere server

Total.js 5 · total5@0.0.19 proxygatewayintegrations Uitgevoerd met Total.js 5

PROXY(prefix, target) stuurt elk verzoek onder een URL-prefix door naar een andere server en streamt het antwoord terug, zodat één Total.js-applicatie voor meerdere diensten kan staan. Het draait vóór de routes, dus een prefix dat door PROXY() wordt afgehandeld, bereikt ROUTE() nooit. Het verzoek wordt doorgegeven met zijn methode, headers en body; de headers x-forwarded-for, x-forwarded-url en x-forwarded-host vertellen de upstream over het oorspronkelijke verzoek. PROXY(prefix) zonder doel verwijdert de proxy.

Het object dat het teruggeeft configureert de proxy: .copy(type) kiest welk deel van het pad naar de upstream wordt gestuurd (zie hieronder), .timeout(ms) begrenst de wachttijd, .check(fn) zorgt dat de proxy alleen geldt wanneer fn(ctrl) true teruggeeft en .before(uri, ctrl) kan het uitgaande verzoek wijzigen, bijvoorbeeld om een header toe te voegen.

.copy() accepteert none (standaard), extend of replace. Met none ontvangt de upstream alleen het pad van het doel plus de query string: /none/a/b/?q=1 wordt /base/?q=1 voor het doel http://host/base/. Met extend wordt de rest van het verzoekpad aan het pad van het doel toegevoegd: /extend/a/b/?q=1 wordt /base/a/b/?q=1, wat je voor een gateway wilt. replace gedraagt zich als extend wanneer het doel een eigen pad heeft; als het doel alleen een host is, stuurt het de rest van het pad zonder de query string, geef dus de voorkeur aan extend.

Voor één enkele route gebruik je $.proxy(url): het stuurt het huidige verzoek (methode, query string, body en headers) naar url en geeft het antwoord van de upstream met zijn statuscode terug.

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