博客迁移
不恰饭的小站
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 只单纯为一个支持中间件的路由库,缺少框架级的支持