Guida Guida allo sviluppo

Instradamento dei nomi di dominio

Dall'inizio del 0.28.0, fibjs di mq.Routing metodo supporta oggetto host come 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 semplici

Supponiamo che il nome di dominio fibjs.org sia stato associato alla macchina in cui si trova la nostra applicazione (a scopo di test, puoi anche modificare gli host localmente per ottenere questo effetto di associazione) e speriamo di scaricare la macchina tramite file.fibjs.org File risorse nella directory FILE_DIR, possiamo fare questo:

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

Lo scenario tipico è che l'applicazione di front-end compilata può essere pubblicata sulla macchina, ad esempio, memorizzata 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

E speriamo di 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

Supponendo che ci siano server API sul computer, si desidera unificarli con il nome di dominio api.fibjs.org , ma assegnare percorsi diversi, come:

Server API uso 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 si desidera che il percorso '/ biz1' accetti solo richieste POST http, è possibile:

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 già associato alla macchina corrente

Esempio complesso

Se non esiste un'altra dichiarazione, nel seguente esempio, 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 }

Distribuzione 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 sopra su un server http (s) e può iniziare a funzionare.Se il server è in ascolto della porta predefinita della macchina in cui si trova (di solito 80), allora uno verrà deviato in base al nome del dominio. Vengono creati servizi gateway per percorsi diversi, il che significa che per svolgere la stessa funzione, è possibile utilizzare solo mq di fibjs.Routing invece di installare servizi gateway tradizionali come nginx / apache / tomcat / iis.