Guía de desarrollo de guías

Enrutamiento de nombre de dominio

A partir de 0.28.0, fibjs objeto mq.Routing 's soporta el método HOST como nombre de dominio de enrutamiento.

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

Manejadores de archivos simples

Suponiendo que el dominio fibjs.org se ha 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 descargarlo en la máquina a través de file.fibjs.org Para los 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 de front-end

Un escenario típico es que la aplicación compilada de front-end puede ser lanzada a la máquina, tal como almacenada 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

Si queremos obtener estos recursos a través de festatic.fibjs.org, podemos escribir:

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

servidor api

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

Servidor API Uso Camino
http://127.0.0.1:3001 Servicio al 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 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 }

Desviación 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 en un servidor http (s), y comenzará a funcionar. Si el servidor escucha el puerto predeterminado de la máquina (generalmente 80), entonces uno se dividirá de acuerdo con el nombre de dominio. Los servicios de puerta de enlace para diferentes rutas están integrados; esto significa que para lograr la misma función, solo puede usar mq.Routing de fibjs en lugar de instalar servicios de puerta de enlace tradicionales como nginx / apache / tomcat / iis.