博客迁移
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 只单纯为一个支持中间件的路由库,缺少框架级的支持
本文详细解读了NodeRed中Express框架的工作原理,包括路由配置、web服务启动以及功能模块拆分。重点介绍了Express如何处理核心路径和API接口,以及其在实现前后端分离中的作用。
4744





