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负责主要的功能接口

功能分阶段描述#

  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
/^\/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
  1. 第二个阶段,服务端监听端口,启动服务
  2. 第三个阶段,接收请求,返回数据

功能使用场景#

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

实现方式优缺点#

优点:

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

缺点:

  1. 原生Express 无法处理 async/await 。如果你在路由处理器或中间件里用到了 async/await 代码,就产生 UnhandledPromiseRejectionWarning 异常,需要做处理才可支持(详解如何让Express支持async/await
  2. Express 只单纯为一个支持中间件的路由库,缺少框架级的支持
作者

lxmuyu

发布于

2022-02-17

更新于

2022-03-09

许可协议