Guide de développement de guide

Routage de nom de domaine

À partir de la version 0.28.0, l'objet fibjs de fibjs 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 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

En supposant que le domaine fibjs.org a été lié à la machine où se trouve notre application (à des fins de test, vous pouvez également modifier les hôtes localement pour obtenir cet effet de liaison), et nous espérons le télécharger sur la machine via file.fibjs.org Pour les ressources de fichiers dans le répertoire FILE_DIR, 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 front-end

Un scénario typique est que l'application frontale compilée peut être publiée sur la machine, par exemple stockée dans le répertoire /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

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 y ait des serveurs API sur votre machine et que vous souhaitiez les unifier au nom de domaine api.fibjs.org , mais attribuez 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 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 du nom de domaine. Les services de passerelle pour différentes routes sont configurés - cela signifie que pour accomplir la même fonction, vous pouvez simplement utiliser mq.Routing de fibjs au lieu d'installer des services de passerelle traditionnels tels que nginx / apache / tomcat / iis.