Guía de desarrollo de guías

Enrutamiento de nombres de dominio

A partir de 0.28.0, fibjsel objeto mq.Routing admite el método HOST como enrutamiento 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

Manejadores de archivos simples

Fibjs.org asume que el nombre de dominio se ha vinculado a la máquina donde está nuestra aplicación (para fines de prueba, también puede lograr esto modificando el efecto de vinculación de Hosts localmente), y esperamos file.fibjs.orgque pueda descargar el directorio de archivos en los recursos de la máquina 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 las aplicaciones de front-end compiladas pueden publicarse en la máquina, por ejemplo, para mantener el /home/frontend/assets/directorio

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 un servidor api en su máquina, desea que unifiquen api.fibjs.orgel nombre de dominio, pero asigne una ruta diferente, como:

Servidor API Uso Sendero
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 }

Desvío 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 puede comenzar a funcionar.Si el servidor escucha el puerto predeterminado de la máquina (generalmente 80), entonces uno se divide 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.

👉 [ Uso del certificado X509 en fibjs ]