带着问题看源码1-NodeRed如何提供Web服务的

博客迁移

不恰饭的小站

NodeRed结构 NodeRed既包含后端也包含前端。后端基于Node.js,同时包含 Express 框架。 Express 是一个保持最小规模的灵活的 Node.js Web 应用程序开发框架,为 Web 和移动应用程序提供一组强大的功能。

NodeRed中的Express工作流

'primaryColor': '#FFFFFF'}}}%% sequenceDiagram autonumber

%%实现 title: NodeRed中的Express之路由配置 packages\node_modules\nodered\red.js
->> packages\node_modules\nodered\red.js: express() 创建app,为web服务提供入口 packages\node_modules\nodered\red.js ->>
packages\node_modules\nodered\red.js:
http.createServer,以app为处理函数,express提供路由、中间件处理

packages\node_modules\nodered\red.js ->>
packages\node_modules\nodered\red.js:根据httpAdminRoot、httpNodeRoot、httpStatic等变量,做根目录‘/’的路由,将根路径'/'路由到RED.httpAdmin(adminApp)上,将根路径'/'路由到RED.httpNode(runtime.httpNode
==nodeApp)上,配合httpin节点,实现节点内的http服务处理

packages\node_modules\nodered\red.js ->>
packages\node_modules\@nodered\runtime\lib\index.js : 配置runtimeb子路由 (
adminApp )

packages\node_modules\nodered\red.js ->>
packages\node_modules\@nodered\editorapi\lib\index.js :
配置editorapi路由,创建 nodeApp 、 adminApp 子路由

packages\node_modules\@nodered\editorapi\lib\index.js ->>
packages\node_modules\@nodered\editorapi\lib\editor\index.js :
配置editor editor模块路由,创建 editorApp 子路由
packages\node_modules\@nodered\editorapi\lib\index.js ->>
packages\node_modules\@nodered\editorapi\lib\admin\index.js :
配置editorapi admin模块路由,创建 adminApp 子路由 ```

```mermaid  %%配置 %%{init: {'theme': 'base', 'themeVariables': {
'primaryColor': '#FFFFFF'}}}%% sequenceDiagram autonumber

%%实现 title: NodeRed中的Express之Web服务启动
packages\node_modules\nodered\red.js ->>
packages\node_modules\nodered\red.js: 完成初始化后,server.listen 配置参数
settings.uiPort settings.uiHost,启动服务 ```

## 功能实现的参与者 packages\node_modules\nodered\red.js中的app提供对根目录 '/' 的路由,具体的实现由runTime实现
packages\node_modules\@nodered\runtime\lib\index.js中的adminApp将功能拆分,分别路由到editorapi和admin模块中;nodeApp将配合httpin节点,实现节点内的http服务处理
packages\node_modules\@nodered\editorapi\lib\editor\index.js的editorApp处理编辑器相关接口
packages\node_modules\@nodered\editorapi\lib\admin\index.js
的adminApp负责主要的功能接口

## 功能分阶段描述
1. 第一个阶段,配置各路径的路由函数

| 路径 | 文件| 处理 | |  ----     | ----|----| | `/`	|
packages\node_modules\nodered\red.js | app | `/`	|
packages\node_modules\@nodered\editorapi\lib\editor\index.js |
editorApp | `/auth/login`	|
packages\node_modules\@nodered\editorapi\lib\index.js | adminApp |
`/auth/token`	| packages\node_modules\@nodered\editorapi\lib\index.js
| adminApp | `/auth/revoke`	|
packages\node_modules\@nodered\editorapi\lib\index.js | adminApp  |
`/icons`	|
packages\node_modules\@nodered\editorapi\lib\editor\index.js |
editorApp | `/icons/:module/:icon`	|
packages\node_modules\@nodered\editorapi\lib\editor\index.js |
editorApp | `/icons/:scope/:module/:icon`	|
packages\node_modules\@nodered\editorapi\lib\editor\index.js |
editorApp | `/theme`	|
packages\node_modules\@nodered\editorapi\lib\editor\index.js |
editorApp | `/projects`	|
packages\node_modules\@nodered\editorapi\lib\editor\index.js |
editorApp | `/^\/locales\/(.+)\/?$/`	|
packages\node_modules\@nodered\editorapi\lib\editor\index.js |
editorApp | `/^\/library\/([^\/]+)\/([^\/]+)(?:$|\/(.*))/`	|
packages\node_modules\@nodered\editorapi\lib\editor\index.js |
editorApp | `/^\/library\/([^\/]+)\/([^\/]+)\/(.*)/`	|
packages\node_modules\@nodered\editorapi\lib\editor\index.js |
editorApp | `/credentials/:type/:id`	|
packages\node_modules\@nodered\editorapi\lib\editor\index.js |
editorApp | `/settings/user`	|
packages\node_modules\@nodered\editorapi\lib\editor\index.js |
editorApp | `/settings/user/keys`	|
packages\node_modules\@nodered\editorapi\lib\editor\index.js |
editorApp | `/flows`	|
packages\node_modules\@nodered\editorapi\lib\admin\index.js | adminApp
| `/flow/:id`	|
packages\node_modules\@nodered\editorapi\lib\admin\index.js | adminApp
| `/flow`	|
packages\node_modules\@nodered\editorapi\lib\admin\index.js | adminApp
| `/nodes`	|
packages\node_modules\@nodered\editorapi\lib\admin\index.js | adminApp
| `/^\/nodes\/messages/`	|
packages\node_modules\@nodered\editorapi\lib\admin\index.js | adminApp
| `/^\/nodes\/((@[^\/]+\/)?[^\/]+\/[^\/]+)\/messages/`	|
packages\node_modules\@nodered\editorapi\lib\admin\index.js | adminApp
| `/^\/nodes\/((@[^\/]+\/)?[^\/]+)$/`	|
packages\node_modules\@nodered\editorapi\lib\admin\index.js | adminApp
| `/^\/nodes\/((@[^\/]+\/)?[^\/]+)\/([^\/]+)$/`	|
packages\node_modules\@nodered\editorapi\lib\admin\index.js | adminApp
| `/context/:scope(global)`	|
packages\node_modules\@nodered\editorapi\lib\admin\index.js | adminApp
| `/context/:scope(global)/*`	|
packages\node_modules\@nodered\editorapi\lib\admin\index.js | adminApp
| `/context/:scope(node|flow)/:id`	|
packages\node_modules\@nodered\editorapi\lib\admin\index.js | adminApp
| `/context/:scope(node|flow)/:id/*`	|
packages\node_modules\@nodered\editorapi\lib\admin\index.js | adminApp
| `/context/:scope(global)/*`	|
packages\node_modules\@nodered\editorapi\lib\admin\index.js | adminApp
| `/context/:scope(node|flow)/:id/*`	|
packages\node_modules\@nodered\editorapi\lib\admin\index.js | adminApp
| `/settings`	|
packages\node_modules\@nodered\editorapi\lib\admin\index.js | adminApp

2. 第二个阶段,服务端监听端口,启动服务
3. 第三个阶段,接收请求,返回数据

## 功能使用场景 做为NodeRed的Web服务出现,是必需的功能。 以RestFul形式提供接口,封装基础与业务功能。

## 实现方式优缺点 优点:
1. 通过封装子路由,将功能拆分到不同模块内,做到职责单一
2. 使用Express做路由,可以对同一地址多种请求方式进行封装,进行资源整合
3. 通过Express中间件,可以做密码验证等多种功能,扩展性强

缺点:
1. 原生Express 无法处理 async/await 。如果你在路由处理器或中间件里用到了 async/await 代码,就产生 UnhandledPromiseRejectionWarning
异常,需要做处理才可支持([详解如何让Express支持async/await](https://www.jb51.net/article/125279.htm))
2. Express 只单纯为一个支持中间件的路由库,缺少框架级的支持
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值