背景は
最近、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);
下の写真は
ルーティングポータルの定義

処理関数の定義

これがルートです/flows対応する処理機能flows.get。
このクラスを挿入すると、ブラウザで表示されるすべてのリクエストがeditor-apiで対応するルーティング設定を見つけることができます。
もちろんワイルドカードもあります。静的資源のロード。
概要まとめ
NODE-REDを改造するには、表示されるページに応じて対応するコードを見つける方法を知る必要があります。
コードを1行変更するだけで、コードの位置を見つけるのに半日かかることもあります。
Leave a Reply