Guida allo sviluppo della guida

Routing del nome di dominio

A partire da 0.28.0, fibjsl'oggetto mq.Routing supporta il metodo HOST come instradamento dei nomi di dominio.

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', ...)

Diamo un'occhiata ad alcuni esempi.

Semplice esempio

FileHandlers semplici

Fibjs.org presuppone che il nome di dominio sia stato associato alla macchina su cui si trova la nostra applicazione (a scopo di test, è possibile ottenere ciò anche modificando l'effetto di associazione Hosts localmente) e speriamo che file.fibjs.orgtu possa scaricare la directory del file sulle risorse FILE_DIR della macchina , Possiamo farlo:

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))

Host di risorse front-end

Uno scenario tipico è la compilazione di applicazioni front-end che possono essere pubblicate sulla macchina, ad esempio per mantenere la /home/frontend/assets/directory

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

Se vogliamo ottenere queste risorse tramite festatic.fibjs.org, possiamo scrivere:

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

server API

Supponiamo che ci sia un server API sulla tua macchina, vuoi che unifichino api.fibjs.orgil nome di dominio, ma assegni un percorso diverso, come ad esempio:

Server API Utilizzo Il percorso
http://127.0.0.1:3001 Servizio utente /utente
http://127.0.0.1:8080 Biz1 /biz1
http://127.0.0.1:9007 Biz2 /biz2

Allora puoi:

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`), })

Inoltre, se desideri che il percorso '/biz1' accetti solo richieste http POST, puoi:

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`), })

Nota che api.fibjs.org deve essere stato associato alla macchina corrente

Esempio complesso

Se non c'è altra dichiarazione, nell'esempio seguente, esistono le seguenti funzioni:

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 }

Deviazione del dominio

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

Successivamente, devi solo montare le rotte nell'esempio sopra su un server http(s) e può iniziare a funzionare.Se il server ascolta la porta predefinita della macchina (di solito 80), allora una viene divisa in base a il nome di dominio I servizi gateway per percorsi diversi sono integrati, questo significa che per svolgere la stessa funzione, è possibile utilizzare solo mq.Routing di fibjs invece di installare servizi gateway tradizionali come nginx/apache/tomcat/iis.

👉 [ Uso del certificato X509 in fibjs ]