ForgeTotal.js 5
el

Total.js 5

Προώθηση αιτημάτων σε άλλον διακομιστή

Total.js 5 · total5@0.0.19 proxygatewayintegrations Εκτελέστηκε με το Total.js 5

Το PROXY(prefix, target) προωθεί σε άλλον διακομιστή κάθε αίτημα κάτω από ένα πρόθεμα URL και επιστρέφει την απάντηση σε μορφή stream, ώστε μία εφαρμογή Total.js να μπορεί να βρίσκεται μπροστά από πολλές υπηρεσίες. Τρέχει πριν από τις διαδρομές, οπότε ένα πρόθεμα που χειρίζεται το PROXY() δεν φτάνει ποτέ στο ROUTE(). Το αίτημα προωθείται με τη μέθοδο, τις κεφαλίδες και το σώμα του· οι κεφαλίδες x-forwarded-for, x-forwarded-url και x-forwarded-host ενημερώνουν τον upstream για το αρχικό αίτημα. Το PROXY(prefix) χωρίς προορισμό αφαιρεί το proxy.

Το αντικείμενο που επιστρέφει ρυθμίζει το proxy: το .copy(type) επιλέγει ποιο μέρος της διαδρομής στέλνεται upstream (βλ. παρακάτω), το .timeout(ms) περιορίζει την αναμονή, το .check(fn) κάνει το proxy να εφαρμόζεται μόνο όταν το fn(ctrl) επιστρέφει true και το .before(uri, ctrl) μπορεί να αλλάξει το εξερχόμενο αίτημα, για παράδειγμα για να προσθέσει μια κεφαλίδα.

Το .copy() δέχεται none (προεπιλογή), extend ή replace. Με το none ο upstream λαμβάνει μόνο τη διαδρομή του προορισμού συν το 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 όταν ο προορισμός έχει δική του διαδρομή· όταν ο προορισμός είναι μόνο ένας host, στέλνει το υπόλοιπο της διαδρομής χωρίς το query string, γι' αυτό προτιμήστε το extend.

Για μία μόνο διαδρομή χρησιμοποιήστε το $.proxy(url): στέλνει το τρέχον αίτημα (μέθοδο, query string, σώμα και κεφαλίδες) στο url και επιστρέφει την απάντηση του upstream με τον κωδικό κατάστασής της.

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