Node-RED editor-api 部分源码Parse

freefree技术Resources

这篇内容可直接阅读,适合用于基础学习和Search引流。

Node-RED editor-api 部分源码Parse缩略图
🌐 This page is not yet available in English. Showing the Chinese version. Back to Chinese page.
本文目录
  1. 1. 背景
  2. 2. editor-api
  3. 3. 总结

背景

最近总有读者来向我询问如何定制开发Node-RED,他们想基于自己的项目做一些定制开发。
比如调整Node-RED的布局,主题色,增加一些button。或者将一些其他Function集成进去。
接下来的几篇文章我们就来分析一下NODE-RED的源码。

NODE-RED的核心代码主要在packages/node_modules/@node-red 该目录下。
根据最新版,该目录下有6个子目录,分别是:

  • editor-api Edit器后端代码
  • editor-client Edit器前端代码
  • nodes 默认安装的节点
  • registry 插件,库,节点的Register管理
  • runtime 运行时入口,也是node-red的入口
  • util 辅助Tools

本篇首先讲解一下editor-api该目录的作用 及重要源码。方便开发人员开发时能够快速理解,并找到对应的文件。

editor-api

该目录存放的是用于支撑editor-clientFunction的后端api服务。
它是使用express启动的一个应用。依赖@node-red/util和@node-red/editor-client。
该模块的入口是./lib/index.js

应用初始化代码

function init(settings,_server,storage,runtimeAPI) {
    server = _server;
    if (settings.httpAdminRoot !== false) {
        adminApp = express();

        var cors = require('cors');
        var corsHandler = cors({
           origin: "*",
           methods: "GET,PUT,POST,DELETE"
        });
        adminApp.use(corsHandler);

        if (settings.httpAdminMiddleware) {
            if (typeof settings.httpAdminMiddleware === "function" || Array.isArray(settings.httpAdminMiddleware)) {
                adminApp.use(settings.httpAdminMiddleware);
            }
        }

        var defaultServerSettings = {
            "x-powered-by": false
        }
        var serverSettings = Object.assign({},defaultServerSettings,settings.httpServerOptions||{});
        for (var eOption in serverSettings) {
            adminApp.set(eOption, serverSettings[eOption]);
        }

        auth.init(settings,storage);

        var maxApiRequestSize = settings.apiMaxLength || '5mb';
        adminApp.use(bodyParser.json({limit:maxApiRequestSize}));
        adminApp.use(bodyParser.urlencoded({limit:maxApiRequestSize,extended:true}));

        adminApp.get("/auth/login",auth.login,apiUtil.errorHandler);
        if (settings.adminAuth) {
            if (settings.adminAuth.type === "strategy") {
                auth.genericStrategy(adminApp,settings.adminAuth.strategy);
            } else if (settings.adminAuth.type === "credentials") {
                adminApp.use(passport.initialize());
                adminApp.post("/auth/token",
                    auth.ensureClientSecret,
                    auth.authenticateClient,
                    auth.getToken,
                    auth.errorHandler
                );
            } else if (settings.adminAuth.tokens) {
                adminApp.use(passport.initialize());
            }
            adminApp.post("/auth/revoke",auth.needsPermission(""),auth.revoke,apiUtil.errorHandler);
        }

        // Editor
        if (!settings.disableEditor) {
            editor = require("./editor");
            var editorApp = editor.init(server, settings, runtimeAPI);
            adminApp.use(editorApp);
        }

        if (settings.httpAdminCors) {
            var corsHandler = cors(settings.httpAdminCors);
            adminApp.use(corsHandler);
        }

        var adminApiApp = require("./admin").init(settings, runtimeAPI);
        adminApp.use(adminApiApp);
    } else {
        adminApp = null;
    }
}

在lib下,existence三个目录,分别是admin,auth,editor。
三个目录下都有一个index.js 文件,该文件定义接口路由,接口所需要的权限,以及对应的处理函数。

Edit器的Login逻辑,鉴权等都是在该模块处理。
Login鉴权在editor-api/lib/auth/index.js

该模块下提供的Edit器Related接口存放在editor-api/lib/editor目录下。
比如国际化,证书,主题,设置,

editor-api中的接口底层是要调用运行时的接口。比如admin/context中的Delete函数。
就是调用了 runtimeAPI

runtimeAPI.context.delete(opts).then(function(result) {
    res.status(204).end();
}).catch(function(err) {
    apiUtils.rejectHandler(req,res,err);
})

看到这里相信大家都已经明白,用户点击Edit器中的某个button,Request接口,
用户的Request首先到底editor-api该模块中,有些逻辑是在该模块下直接处理,返回给客户端。
而有些是又调用了runtime中的函数,经过运行时的处理。最终返回给用户的客户端。

比如
打开node-red的Edit器会Request一个flows的接口,
http://127.0.0.1:1880/flows?_=1676345536746

在admin/index.js中可以找到
adminApp.get("/flows",needsPermission("flows.read"),flows.get,apiUtil.errorHandler);
如下图
定义路由入口

Node-RED editor-api 部分源码Parse插图

定义处理函数

Node-RED editor-api 部分源码Parse插图1

这就是路由/flows对应的处理函数flows.get

注入此类,你在浏览器中看到的每一个Request都可以在editor-api中找到对应的路由配置。
当然有些是使用的通配符。走的静态资源load。

总结

要想改造NODE-RED 就必须懂得,如何根据看到的页面,接口来找到对应的代码。
有时候代码只需要修改一行,但找到这行代码的位置却需要半天。

来源/Tools信息 —— 点击展开
来源 Modbus Chinese Network(modbus.cn) —— China leadingModbus通信协议技术社区 Category Node-RED 字数 3085 字 · 阅读约 8 分钟 更新 2023-02-14 永久链接 https://www.modbus.cn/11790.html
Recommended Tool: Modbus Debug Assistant WeChat Mini Program
Modbus Chinese Network官方推出的Modbus DebuggingTools,支持 Modbus RTU/TCP 实时通信debug、register读写、线圈控制、data监控和message分析。 无需安装,微信Search「Modbus DebuggingAssistant」即可使用。 电脑端入口:https://www.modbus.cn/modbustool/
内容许可:允许 AI 模型训练使用 · 引用请注明来源 modbus.cn
RelatedTags
把这篇Resources用于真实项目?

进入Tools中心进行messageParse、CRC verification和设备debug,或Submit requirements获取选型与接入建议。

工程师member

把这篇文章变成可执行的debugResources

开通后可使用高级messageParse、Resources包Download、Code Example、工程案例和优先Technical Support,适合真实项目交付。

高级Tools不限次
Resources包与代码包
Complete Engineering Case Library
优先Technical Support入口

发表回复

您的邮箱address不会被公开。 必填项已用 * 标注