가이드 개발 가이드

도메인 이름 라우팅

0.28.0에서 시작, fibjs 의 mq.Routing 개체는 도메인 이름 라우팅과 HOST 방법을 지원합니다.

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

몇 가지 예를 살펴 보겠습니다.

간단한 예

간단한 fileHandlers

도메인 fibjs.org가 애플리케이션이있는 머신에 바인딩되었다고 가정하고 (테스트 목적으로 호스트를 로컬로 수정하여이 바인딩 효과를 얻을 수도 있음) file.fibjs.org 통해 머신에 다운로드 할 수 있습니다. FILE_DIR 디렉토리의 파일 리소스에 대해 다음을 수행 할 수 있습니다.

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

프런트 엔드 리소스 호스트

일반적인 시나리오는 컴파일 된 프런트 엔드 응용 프로그램이 /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

festatic.fibjs.org를 통해 이러한 리소스를 얻으려면 다음과 같이 작성할 수 있습니다.

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

API 서버

머신에 api 서버가 있고이를 도메인 이름 api.fibjs.org 로 통합하려고하지만 다음과 같이 다른 경로를 할당한다고 가정합니다.

API 서버 용법 통로
http://127.0.0.1:3001 사용자 서비스 /사용자
http://127.0.0.1:8080 Biz1 / biz1
http://127.0.0.1:9007 Biz2 / biz2

그런 다음 다음을 수행 할 수 있습니다.

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

또한 '/ biz1'경로가 http POST 요청 만 수락하도록하려면 다음을 수행 할 수 있습니다.

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

api.fibjs.org가 현재 시스템에 바인딩되어 있어야합니다

복잡한 예

다른 선언이없는 경우 다음 예에서 다음 함수가 존재합니다.

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 }

도메인 전환

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

다음으로, 위의 예에서 라우트를 http (s) Server에 마운트하면 작동이 시작됩니다. 서버가 시스템의 기본 포트 (일반적으로 80)를 수신하는 경우 도메인 이름에 따라 하나가 분할됩니다. 다른 경로에 대한 게이트웨이 서비스가 내장되어 있습니다. 즉, 동일한 기능을 수행하려면 nginx / apache / tomcat / iis와 같은 기존 게이트웨이 서비스를 설치하는 대신 fibjs의 mq.Routing 만 사용할 수 있습니다.