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

無料無料技术资料

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

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

背景は

最近、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行変更するだけで、コードの位置を見つけるのに半日かかることもあります。

関連タグ
この資料を実際のプロジェクトに活用しませんか?

ツールセンターで電文解析、CRCチェック、デバイスデバッグを行うか、要件を送信して選定と接続のアドバイスを受けましょう。

エンジニア会員

この記事を実行可能なデバッグ資料に

登録すると、高度な電文解析、資料パックのダウンロード、コード例、エンジニアリングケース、優先技術サポートが利用可能に。実際のプロジェクト納品に最適です。

高度なツール無制限
資料パックとコードパック
完全なエンジニアリングケースライブラリ
優先技術サポート窓口

发表回复

あなたのメールアドレスアドレス不会被公开。 必須項目已用 * 标注