Leitfaden zur Leitfadenentwicklung

Routing von Domainnamen

Ab 0.28.0 fibjsunterstützt das mq.Routing-Objekt die HOST-Methode als Domänennamen-Routing.

1 2 3 4 5 6 7 8 9 10 11 12
const mq = require('mq') const rt = new mq.Routing(); // support *.fibjs.org in Routing rt.host('*.fibjs.org', ...) // support api.fibjs.org in Routing rt.host('api.fibjs.org', ...) // support fibjs.org in Routing rt.host('fibjs.org', ...) rt.append('host', 'fibjs.org', ...)

Schauen wir uns einige Beispiele an.

Einfaches Beispiel

Einfache FileHandler

Angenommen, der Domänenname fibjs.org wurde an den Computer gebunden, auf dem sich unsere Anwendung befindet (zu Testzwecken können Sie diesen Bindungseffekt auch durch lokales Ändern von Hosts erzielen), und wir hoffen, file.fibjs.orgDateiressourcen im FILE_DIR herunterladen zu können Verzeichnis auf der Maschine, können wir Folgendes tun:

1 2 3 4 5 6
const mq = require('mq') const http = require('http') const fileRoutes = new mq.Routing(); // support file.fibjs.org in Routing fileRoutes.host('file.fibjs.org', http.fileHandler(FILE_DIR))

Front-End-Ressourcenhost

Ein typisches Szenario besteht darin, dass die kompilierte Front-End-Anwendung auf dem Computer veröffentlicht und beispielsweise im /home/frontend/assets/Verzeichnis gespeichert wird

1 2 3 4 5
/home/frontend/assets/index.html /home/frontend/assets/200.html /home/frontend/assets/app.839ca9.js /home/frontend/assets/common.537a50.js /home/frontend/assets/chunk.d45858.js

Und wenn wir diese Ressourcen über festatic.fibjs.org erhalten möchten, können wir so schreiben:

1
fileRoutes.host('festatic.fibjs.org', http.fileHandlers('/home/frontend/assets/'))

API-Server

Angenommen, es gibt API-Server auf Ihrem Computer und Sie möchten diese mit api.fibjs.orgdiesem Domänennamen vereinheitlichen, aber unterschiedliche Pfade zuweisen, wie zum Beispiel:

API-Server Verwendung Weg
http://127.0.0.1:3001 Benutzerservice /Benutzer
http://127.0.0.1:8080 Biz1 /biz1
http://127.0.0.1:9007 Biz2 /biz2

Dann kannst du:

1 2 3 4 5 6 7 8 9 10
const mq = require('mq') const apiRoutes = new mq.Routing(); // proxyTo 是代理请求到对应 origin 的函数 apiRoutes.host('api.fibjs.org', { '/user': (req) => proxyTo(req, `http://127.0.0.1:3001`), '/biz1': (req) => proxyTo(req, `http://127.0.0.1:8080`), '/biz2': (req) => proxyTo(req, `http://127.0.0.1:9007`), })

Wenn Sie außerdem möchten, dass der Pfad „/biz1“ nur HTTP-POST-Anfragen akzeptiert, können Sie Folgendes tun:

1 2 3 4 5 6 7 8 9
const mq = require('mq') const apiRoutes = new mq.Routing(); apiRoutes.host('api.fibjs.org', { '/user': (req) => proxyTo(req, `http://127.0.0.1:3001`), '/biz1': apiRoutes.post((req) => proxyTo(req, `http://127.0.0.1:8080`)), '/biz2': (req) => proxyTo(req, `http://127.0.0.1:9007`), })

Beachten Sie, dass api.fibjs.org an den aktuellen Computer gebunden sein muss

Komplexes Beispiel

Wenn keine anderen Deklarationen vorhanden sind, existieren im folgenden Beispiel die folgenden Funktionen:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
// 生成带特定 host 的请求 function getRequest({ path = '/', host = 'www.fibjs.org' }) { const req = new http.Request() req.value = path req.addHeader('host', host) return req } // 以 method 尝试对 routes 发起一个 header: host=host 的请求 function invokePathFromHost (path, host, method = 'GET') { const req = getRequest({ path, host }) req.method = method mq.invoke(routes, req) const result = req.response.body.readAll() return result ? result.toString() : result }

Umleitung von Domainnamen

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
const mq = require('mq') const http = require('http') const assert = require('assert') const routes = new mq.Routing(); routes.host('api.fibjs.org', [ { '/user/information': req => req.response.json({name: 'xicilion'}), }, req => req.response.body.rewind() ]) // routes.host 方法可以多次调用 routes.host('*.fibjs.org', [ { '/': req => req.response.json({message: 'I am in root'}), '/index.html': req => req.response.body.write(`<html><body>hello fibjs</body></html>`), '/index.js': req => req.response.body.write(`console.log('hello world')`), '*': (req, domain) => { req.response.json({message: 'I am fallback'}) } }, req => req.response.body.rewind() ]) assert.equal( invokePathFromHost('/', 'www.fibjs.org'), `{"message":"I am in root"}` ) assert.equal( invokePathFromHost('/index.html', 'static.fibjs.org'), `<html><body>hello fibjs</body></html>` ) assert.equal( invokePathFromHost('/index.js', 'static.fibjs.org'), `console.log('hello world')` ) assert.equal( invokePathFromHost('/user/information', 'api.fibjs.org'), JSON.stringify({name: 'xicilion'}) ) try { invokePathFromHost('/', 'fibjs.org') } catch (error) { assert.equal(error, 'Error: Routing: unknown routing: fibjs.org') }

Als nächstes müssen Sie nur noch die Routen im obigen Beispiel auf einem http(s)-Server mounten, und schon kann es losgehen. Wenn der Server auf den Standard-Port der Maschine lauscht (normalerweise 80), dann erfolgt eine Verkehrsverteilung basierend auf dem Domänenname Die Gateway-Dienste für verschiedene Routen wurden eingerichtet. Dies bedeutet, dass Sie zum Ausführen derselben Funktion nur mq.Routing von fibjs verwenden können, ohne herkömmliche Gateway-Dienste wie nginx/Apache/Tomcat/iis installieren zu müssen.

👉 [ Verwendung des X509-Zertifikats in fibjs ]