Guide de développement du guide

Routage de nom de domaine

À partir de la version 0.28.0, fibjsl'objet mq.Routing prend en charge la méthode HOST comme routage de nom de domaine.

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

Regardons quelques exemples.

Exemple simple

Gestionnaires de fichiers simples

Supposons que le nom de domaine fibjs.org ait été lié à la machine sur laquelle se trouve notre application (à des fins de test, vous pouvez également obtenir cet effet de liaison en modifiant les hôtes localement), et nous espérons pouvoir file.fibjs.orgtélécharger les ressources du fichier dans le FILE_DIR. répertoire sur la machine, on peut faire ceci :

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

Hôte de ressources frontales

Un scénario typique est que l'application frontale compilée peut être publiée sur la machine, par exemple enregistrée dans /home/frontend/assets/le répertoire

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

Et si nous voulons obtenir ces ressources via festatic.fibjs.org, nous pouvons écrire comme ceci :

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

serveur API

Supposons qu'il y ait des serveurs API sur votre machine et que vous souhaitiez les unifier avec api.fibjs.orgce nom de domaine, mais attribuer des chemins différents, tels que :

Serveur API Usage Chemin
http://127.0.0.1:3001 Service utilisateur /utilisateur
http://127.0.0.1:8080 Entreprise1 /biz1
http://127.0.0.1:9007 Biz2 /biz2

Ensuite vous pouvez:

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

De plus, si vous souhaitez que le chemin '/biz1' n'accepte que les requêtes http POST, vous pouvez :

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

Notez que api.fibjs.org doit être lié à la machine actuelle

Exemple complexe

S'il n'y a pas d'autres déclarations, dans l'exemple suivant, les fonctions suivantes existent :

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 }

Détournement de nom de domaine

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

Ensuite, il vous suffit de monter les routes de l'exemple ci-dessus sur un serveur http(s), et il peut commencer à fonctionner. Si le serveur écoute le port par défaut de la machine (généralement 80), alors une répartition du trafic basée sur le nom de domaine Les services de passerelle pour différentes routes ont été configurés - cela signifie que pour remplir la même fonction, vous ne pouvez utiliser que le mq.Routing de fibjs sans avoir à installer des services de passerelle traditionnels tels que nginx/apache/tomcat/iis.

👉 [ Utilisation du certificat X509 dans fibjs ]