Leitfaden-Entwicklungsleitfaden

Domainnamen-Routing

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

1 2 3 4 5 6 7 8 9 10 11 12 13
const mq = require('mq') const rt = new mq.Routing(); // 使得 routes 支持 *.fibjs.org 解析 rt.host('*.fibjs.org', ...) // 使得 routes 支持 api.fibjs.org 解析 rt.host('api.fibjs.org', ...) // 使得 routes 支持 www.fibjs.org, other.fibjs.org, *.fibjs.org 解析 rt.host('fibjs.org', ...) // `rt.host(...args)` 实际上是 `rt.append('host', ...args)` 的别名 rt.append('host', 'fibjs.org', ...)

Schauen wir uns einige Beispiele an.

Einfaches Beispiel

Einfache fileHandler

Fibjs.org geht davon aus, dass der Domänenname an den Computer gebunden wurde, auf dem sich unsere Anwendung befindet (zu Testzwecken können Sie dies auch erreichen, indem Sie den Bindungseffekt für Hosts lokal file.fibjs.orgändern ), und wir hoffen, dass Sie das Dateiverzeichnis auf dem Computer herunterladen können FILE_DIR-Ressourcen , Wir können das schaffen:

1 2 3 4 5 6
const mq = require('mq') const http = require('http') const fileRoutes = new mq.Routing(); // 对域名 file.fibjs.org 的请求, 以 fileHandler 响应 fileRoutes.host('file.fibjs.org', http.fileHandler(FILE_DIR))

Front-End-Ressourcenhost

Ein typisches Szenario besteht darin, dass kompilierte Front-End-Anwendungen auf dem Computer veröffentlicht werden können, z. B. um das /home/frontend/assets/Verzeichnis zu behalten

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

Wenn wir diese Ressourcen über festatic.fibjs.org beziehen möchten, können wir schreiben:

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

API-Server

Angenommen, es gibt einen API-Server auf Ihrem Computer, Sie möchten, dass er api.fibjs.orgden Domänennamen vereinheitlicht , aber einen anderen Pfad zuweisen, wie zum Beispiel:

API-Server Verwendung Pfad
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:

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 andere Deklaration vorhanden ist, 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 }

Domainumleitung

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 die Routen im obigen Beispiel auf einen http(s)Server mounten und es kann losgehen.Wenn der Server auf den Standardport der Maschine (normalerweise 80) lauscht, dann wird einer entsprechend aufgeteilt der Domänenname Die Gateway-Dienste für verschiedene Routen sind eingebaut. Das bedeutet, dass Sie zur Ausführung derselben Funktion nur mq.Routing von fibjs verwenden können, anstatt herkömmliche Gateway-Dienste wie nginx/apache/tomcat/iis zu installieren.

👉 [ Verwendung des X509-Zertifikats in fibjs ]