Leitfaden Entwicklungshandbuch

Domain Name Routing

Von Anfang 0.28.0, fibjs Routing von mq.Routing Objektträger HOST Methode als Domäne.

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

Angenommen, der Domainname fibjs.org wurde an den Computer gebunden, auf dem sich unsere Anwendung befindet (zu Testzwecken können Sie diesen Bindungseffekt auch erzielen, indem Sie Hosts lokal file.fibjs.org ), und wir hoffen, ihn über file.fibjs.org auf den Computer herunterladen zu file.fibjs.org Dateiressourcen im Verzeichnis FILE_DIR, wir können dies tun:

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

Das typische Szenario besteht darin, dass die kompilierte Front-End-Anwendung möglicherweise auf dem Computer freigegeben wird, z. B. im Verzeichnis /home/frontend/assets/

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 wir wollen diese Ressourcen über festatic.fibjs.org erhalten, wir können schreiben:

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

API-Server

Angenommen, auf Ihrem Computer befinden sich API-Server. Sie möchten diese mit dem Domänennamen api.fibjs.org , aber unterschiedliche Pfade zuweisen, z.

API-Server Verwendung Pfad
http://127.0.0.1:3001 Benutzerdienst / user
http://127.0.0.1:8080 Biz1 / biz1
http://127.0.0.1:9007 Biz2 / biz2

Dann können Sie:

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 bereits an den aktuellen Computer gebunden sein muss

Komplexes Beispiel

Wenn es keine andere Anweisung gibt, 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 }

Domainnamenumleitung

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 funktioniert. Wenn dieser Server den Standardport des Computers abhört (normalerweise 80), wird einer nach dem Domänennamen aufgeteilt Die Gateway-Dienste für verschiedene Routen sind eingerichtet. Dies 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.