Guía de desarrollo de la guía

Enrutamiento de nombres de dominio

A partir de 0.28.0, el objeto fibjs de fibjs admite el método HOST como una ruta de nombre de dominio.

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

Veamos algunos ejemplos.

Ejemplo simple

FileHandlers simples

Suponiendo que el nombre de dominio fibjs.org se haya vinculado a la máquina donde se encuentra nuestra aplicación (para fines de prueba, también puede modificar los hosts localmente para lograr este efecto vinculante), y esperamos que file.fibjs.org se pueda descargar en la máquina Recursos de archivo en el directorio FILE_DIR, podemos hacer esto:

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 de recursos front-end

El escenario típico es que la aplicación front-end compilada puede publicarse en la máquina, por ejemplo, almacenarse en el directorio /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

Y esperamos obtener estos recursos a través de festatic.fibjs.org, podemos escribir así:

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

servidor api

Suponiendo que hay servidores api en su máquina, desea unificarlos al nombre de dominio api.fibjs.org , pero asigne diferentes rutas, como:

Servidor API Uso Camino
http://127.0.0.1:3001 Servicio de usuario /usuario
http://127.0.0.1:8080 Biz1 / biz1
http://127.0.0.1:9007 Biz2 / biz2

Entonces tú puedes:

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

Además, si desea que la ruta '/ biz1' solo acepte solicitudes HTTP POST, puede:

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

Tenga en cuenta que api.fibjs.org ya debe estar vinculado a la máquina actual

Ejemplo complejo

Si no hay otra declaración, en el siguiente ejemplo, existen las siguientes funciones:

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 }

Distribución de nombres de 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') }

A continuación, solo necesita montar las rutas en el ejemplo anterior a un Servidor http (s), y puede comenzar a funcionar. Si el servidor escucha el puerto predeterminado de la máquina donde está ubicado (generalmente 80), uno se derivará de acuerdo con el nombre de dominio. Se construyen servicios de puerta de enlace para diferentes rutas, esto significa que para lograr la misma función, puede usar solo mb. Enrutamiento de fibjs en lugar de instalar servicios de puerta de enlace tradicionales como nginx / apache / tomcat / iis.