Leitfaden Entwicklungshandbuch

Domain Name Routing

Ab 0.28.0 fibjsunterstützt das Objekt mq.Routing die HOST-Methode als Domain Name 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 Hosts-Bindungseffekt lokal file.fibjs.orgändern ), und wir hoffen, dass Sie das Dateiverzeichnis auf den FILE_DIR-Ressourcen des Computers herunterladen können , 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 ist, dass kompilierte Front-End-Anwendungen möglicherweise auf dem Computer veröffentlicht werden, um beispielsweise 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 erhalten möchten, können wir schreiben:

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

API-Server

Angenommen, auf Ihrem Computer befindet sich ein API-Server. Sie möchten, dass dieser api.fibjs.orgden Domänennamen vereinheitlicht , aber einen anderen Pfad zuweist, z.

API-Server Verwendung Pfad
http://127.0.0.1:3001 Benutzerdienst /Nutzer
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 der Pfad '/ biz1' nur http-POST-Anforderungen akzeptieren soll, 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, sind im folgenden Beispiel die folgenden Funktionen vorhanden:

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 einem http (s) -Server bereitstellen, und es kann beginnen zu funktionieren. Wenn der Server den Standardport des Computers abhört (normalerweise 80), wird einer entsprechend aufgeteilt Der Domänenname Die Gateway-Dienste für verschiedene Routen sind erstellt. Dies bedeutet, dass Sie zur Ausführung derselben Funktion nur das 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 ]