2021-07-12-带着问题看源码1-NodeRed如何提供Web服务的
NodeRed结构#
NodeRed既包含后端也包含前端。后端基于Node.js,同时包含 Express 框架。
Express 是一个保持最小规模的灵活的 Node.js Web 应用程序开发框架,为 Web 和移动应用程序提供一组强大的功能。
NodeRed中的Express工作流#
%%配置 %%{init: {'theme': 'base', 'themeVariables': { '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 子路由
%%配置 %%{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负责主要的功能接口
功能分阶段描述#
- 第一个阶段,配置各路径的路由函数
路径 | 文件 | 处理 |
---|---|---|
/ |
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 |
/^\/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 |
`/context/:scope(node | flow)/:id/*` | packages\node_modules@nodered\editorapi\lib\admin\index.js |
/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 |
/settings |
packages\node_modules@nodered\editorapi\lib\admin\index.js | adminApp |
- 第二个阶段,服务端监听端口,启动服务
- 第三个阶段,接收请求,返回数据
功能使用场景#
做为NodeRed的Web服务出现,是必需的功能。
以RestFul形式提供接口,封装基础与业务功能。
实现方式优缺点#
优点:
- 通过封装子路由,将功能拆分到不同模块内,做到职责单一
- 使用Express做路由,可以对同一地址多种请求方式进行封装,进行资源整合
- 通过Express中间件,可以做密码验证等多种功能,扩展性强
缺点:
- 原生Express 无法处理 async/await 。如果你在路由处理器或中间件里用到了 async/await 代码,就产生 UnhandledPromiseRejectionWarning 异常,需要做处理才可支持(详解如何让Express支持async/await)
- Express 只单纯为一个支持中间件的路由库,缺少框架级的支持
2021-07-12-带着问题看源码1-NodeRed如何提供Web服务的
https://blog.buqia.fun/2022/02/17/2021-07-12-带着问题看源码1-NodeRed如何提供Web服务的/