Guida allo sviluppo della guida

Instradamento del nome di dominio

A partire da 0.28.0, fibjs oggetto mq.Routing s' supporta il metodo host come nome di dominio di 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', ...)

Diamo un'occhiata ad alcuni esempi.

Semplice esempio

FileHandlers semplice

Supponendo che il dominio fibjs.org sia stato associato alla macchina in cui si trova la nostra applicazione (a scopo di test, è anche possibile modificare localmente gli host per ottenere questo effetto vincolante) e speriamo di scaricarlo sulla macchina tramite file.fibjs.org Per le risorse di file nella directory FILE_DIR, 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 è che l'applicazione front-end compilata possa essere rilasciata sulla macchina, ad esempio archiviata nella directory /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

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

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

api server

Supponiamo che sul tuo computer siano presenti server API e desideri unificarli al nome di dominio api.fibjs.org , ma assegna percorsi diversi, ad esempio:

Server API Utilizzo Sentiero
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`), })

Si noti che api.fibjs.org deve essere stato 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 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 inizierà a funzionare. Se il server ascolta la porta predefinita della macchina (di solito 80), allora una sarà divisa in base al nome di dominio I servizi gateway per percorsi diversi sono costruiti: ciò significa che per svolgere la stessa funzione, è possibile utilizzare solo mq.Routing di fibjs invece di installare i servizi gateway tradizionali come nginx / apache / tomcat / iis.