Node-RED editor-apiのソースコードParse

freeFree Technical Resource

This content is free to read, suitable for basic learning and search traffic.

Node-RED editor-apiのソースコードParse

背景は

最近、Node-REDのカスタム開発方法について尋ねてきて、自分のプロジェクトに基づいてカスタム開発をしたいという読者がよくいます。
Node-REDのレイアウト、テーマカラーの調整、ボタンの追加などです。または他の機能を組み込む。
次の記事では、NODE-REDのソースコードを分析します。

NODE-REDの基本コードはpackages/node_modules/@node-red このディレクトリの下で
最新版によると、このディレクトリの下には6つのサブディレクトリがあり、それぞれ:

  • editor-apiエディタバックエンドコード
  • editor-clientエディタのフロントエンドコード
  • nodesデフォルトでインストールされるノード
  • registryプラグイン、ライブラリ、ノードのレジストリ管理
  • runtimeランタイムエントリ、node-redエントリ
  • util補助ツール

この記事では、まずeditor-apiディレクトリの役割と重要なソースコードについて説明します。開発者は迅速に理解し、対応するファイルを見つけることができます。

editor-api

このディレクトリには、editor-client機能をサポートするバックエンド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にはadmin、auth、editorの3つのディレクトリがあります。
3つのディレクトリには、インターフェイスのルーティング、インターフェイスに必要なパーミッション、および対応するハンドラを定義するindex.jsファイルがあります。

エディタのログインロジック、認証などはすべてこのモジュールで処理されます。
登録認証はこちらeditor-api/lib/auth/index.js

このモジュールで提供されるエディタ関連インタフェースは、editor-api/lib/editorカタログの下。
国際化、証明書、トピック、設定など、

editor-api内のインターフェイスの下位レベルは、ランタイムを呼び出すインターフェイスです。admin/contextの削除機能のように。
呼び出しただけ。 runtimeAPI

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

皆さんご存知のように、ユーザーはエディタのボタンをクリックしてインターフェイスをリクエストします。
ユーザのリクエストは最初にeditor-apiモジュールでは、いくつかのロジックがモジュールの下で直接処理され、クライアントに返されます。
一部はランタイム内の関数を呼び出し、ランタイム処理を行います。最終的にユーザーに返されます。

例えば、
node-redを開くエディタは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のソースコード解析插图

処理関数の定義

Node-RED editor-apiのソースコード解析插图1

これがルートです/flows対応する処理機能flows.get

このクラスを挿入すると、ブラウザで表示されるすべてのリクエストがeditor-apiで対応するルーティング設定を見つけることができます。
もちろんワイルドカードもあります。静的資源のロード。

概要まとめ

NODE-REDを改造するには、表示されるページに応じて対応するコードを見つける方法を知る必要があります。
コードを1行変更するだけで、コードの位置を見つけるのに半日かかることもあります。

Related Tags
Put this resource to use in a real project?

Go to the Tool Center for message parsing, CRC verification and device debugging, or submit your requirements for selection and integration advice.

Engineer Membership

Turn this article into actionable debugging resources

After activation, you can use advanced message parsing, resource pack downloads, code examples, engineering cases and priority technical support, suitable for real project delivery.

Unlimited Advanced Tools
Resource & Code Packs
Complete Engineering Case Library
Priority Technical Support

Leave a Reply

Your email address will not be published. Required fields are marked *.