Guida allo sviluppo della guida

Instradamento dei nomi di dominio

A partire dalla versione 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
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', ...)

Diamo un'occhiata ad alcuni esempi.

Esempio semplice

Gestori di file semplici

Supponiamo che il nome di dominio fibjs.org sia stato associato alla macchina su cui si trova la nostra applicazione (a scopo di test, è anche possibile ottenere questo effetto vincolante modificando Hosts localmente), e speriamo di poter file.fibjs.orgscaricare le risorse del file nella FILE_DIR directory sulla macchina, possiamo fare questo:

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

Host di risorse front-end

Uno scenario tipico è che l'applicazione front-end compilata possa essere pubblicata sulla macchina, ad esempio salvata nella /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

E se vogliamo ottenere queste risorse tramite festatic.fibjs.org, possiamo scrivere in questo modo:

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

server API

Supponiamo che ci siano server API sul tuo computer e che desideri unificarli a api.fibjs.orgquesto nome di dominio, ma assegnare percorsi diversi, come ad esempio:

Server API Utilizzo Sentiero
http://127.0.0.1:3001 Servizio utenti /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`), })

Tieni presente che api.fibjs.org deve essere associato alla macchina corrente

Esempio complesso

Se non sono presenti altre dichiarazioni, 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 nome di 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 i percorsi nell'esempio precedente su un server http(s) e può iniziare a funzionare. Se il server ascolta la porta predefinita della macchina (solitamente 80), allora una distribuzione del traffico basata sulla nome dominio Sono stati impostati servizi gateway per percorsi diversi, ciò significa che per completare la stessa funzione è possibile utilizzare solo mq.Routing di fibjs senza dover installare servizi gateway tradizionali come nginx/apache/tomcat/iis.

👉 [ Utilizzo del certificato X509 in fibjs ]