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 en tant que routage de nom de domaine.

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

Regardons quelques exemples.

Exemple simple

Gestionnaires de fichiers simples

Fibjs.org suppose que le nom de domaine a été lié à la machine sur laquelle notre application (à des fins de test, vous pouvez également y parvenir en modifiant localement l'effet de liaison Hosts), et nous espérons que file.fibjs.orgvous pourrez télécharger le répertoire de fichiers sur la machine FILE_DIR resources , Nous pouvons le faire:

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

Hôte de ressources frontal

Un scénario typique est que des applications frontales compilées peuvent être publiées sur la machine, par exemple pour conserver le /home/frontend/assets/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

Si nous voulons obtenir ces ressources via festatic.fibjs.org, nous pouvons écrire :

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

serveur API

Supposons qu'il existe un serveur API sur votre machine, vous souhaitez qu'ils unifient api.fibjs.orgle nom de domaine, mais attribuez un chemin différent, tel que :

Serveur d'API Usage Chemin
http://127.0.0.1:3001 Service aux utilisateurs /utilisateur
http://127.0.0.1:8080 Biz1 /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 avoir été lié à la machine actuelle

Exemple complexe

S'il n'y a pas d'autre déclaration, 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 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 cela peut commencer à fonctionner. Si le serveur écoute le port par défaut de la machine (généralement 80), alors l'un est divisé en fonction de le nom de domaine Les services de passerelle pour différentes routes sont construits. Cela signifie que pour accomplir la même fonction, vous ne pouvez utiliser que mq.Routing de fibjs au lieu d'installer des services de passerelle traditionnels tels que nginx/apache/tomcat/iis.

👉 [ Utilisation du certificat X509 dans fibjs ]