Node-RED Editor-API - Quellcode-Analyse

kostenlosKostenloses technisches Material

Dieser Inhalt ist direkt lesbar und eignet sich für das Grundlagenlernen und die Suche.

Node-RED Editor-API - Quellcode-Analyse

Hintergrund

In letzter Zeit haben mich immer Leser gefragt, wie ich Node-RED benutzerdefiniert entwickeln kann, die etwas benutzerdefiniert entwickeln möchten, basierend auf ihren eigenen Projekten.
Zum Beispiel die Anpassung des Layouts von Node-RED, die Farbe des Themas und das Hinzufügen einiger Schaltflächen. Oder integrieren Sie andere Funktionen.
In den folgenden Artikeln werden wir den Quellcode von NODE-RED analysieren.

Der Kerncode von NODE-RED ist vor allempackages/node_modules/@node-red unter diesem Katalog.
Nach der neuesten Version gibt es sechs Unterverzeichnisse unter diesem Verzeichnis:

  • editor-api Back-End - Code
  • Editor-Client Front-End - Editor-Code
  • Knoten Standardinstallation
  • Registrierung Plug-ins, Bibliotheken, Registrierungsverwaltung von Knoten
  • Laufzeit-Eingang und auch Eingang für node-red
  • Utility

Dieser Artikel beschreibt zunächst die Funktion des editor-api und den wichtigen Quellcode des Verzeichnisses. Erleichtert den Entwicklern, die entsprechenden Dateien schnell zu verstehen und zu finden.

editor-api

Dieses Verzeichnis enthält den Back-End - API-Dienst, der die Editor-Client - Funktionen unterstützt.
Es handelt sich um eine Anwendung, die mit Express gestartet wird. Abhängig von @ node-red / util und @ node-red / editor-client
Der Eingang dieses Moduls ist./lib/index.js

Der Initialisierungscode

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;
    }
}

unter lib gibt es drei Verzeichnisse: admin, auth, editor.
In allen drei Verzeichnissen befindet sich eine index.js-Datei, die die Schnittstellenrouting, die für die Schnittstelle erforderlichen Berechtigungen und die entsprechenden Verarbeitungsfunktionen definiert.

Die Logik des Editors, die Authentifizierung usw. werden in diesem Modul behandelt.
Login-Authentifizierung Die Editor-bezogene Schnittstelle, die unter dem Moduleditor-api/lib/auth/index.js

zur Verfügung gestellt wird, ist untereditor-api/lib/editorim Katalog.
Zum Beispiel Internationalization, Zertifikate, Themen, Einstellungen,

Die unterste Schnittstelle in editor-api ist die Schnittstelle, die zur Laufzeit aufgerufen wird. Zum Beispiel die Löschenfunktion in admin / context.
ist der AufrufruntimeAPI

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

hier zu sehen, glaube, jeder hat verstanden, Benutzer klicken auf einen Knopf im Editor, die Schnittstelle,
Benutzeranfragen gehen zuerst an das Editor-API - Modul, und einige Logik wird direkt unter dem Modul verarbeitet und an den Client zurückgegeben.
Einige werden in der Runtime-Funktion aufgerufen und werden in der Laufzeit verarbeitet. Letztendlich an den Kunden zurückgegeben.

Zum Beispiel
Öffnen Sie den Editor von node-red, um eine Schnittstelle für flows anzufordern.
http://127.0.0.1:1880/flows?_=1676345536746

Sie können es unter admin / index.js finden.
adminApp.get("/flows",needsPermission("flows.read"),flows.get,apiUtil.errorHandler);
wie folgt abgebildet
Routing-Eingang definieren

Node-RED Editor-API - Quellcode-AnalyseAbbildung

Definition der Verarbeitungsfunktion

Node-RED Editor-API - Quellcode-AnalyseAbbildung1

Das ist die Route./flowsEntsprechende Verarbeitungsfunktionflows.get

Jede Anfrage, die Sie in Ihrem Browser sehen, findet eine entsprechende Routing-Konfiguration in der editor-API.
Natürlich gibt es einige, die verwendet werden. Die statischen Ressourcen sind geladen.

Zusammenfassung

Um NODE-RED zu modifizieren, muss man wissen, wie man den entsprechenden Code basierend auf der Seite, die man sieht, findet.
Manchmal braucht es nur eine Zeile zu ändern, aber es dauert einen halben Tag, um den Standort dieser Zeile zu finden.

Relevante Etiketten
Sollte man diese Informationen für ein echtes Projekt verwenden?

Gehen Sie zum Tool Center, um Nachrichten zu analysieren, CRC-Prüfungen und Geräte-Debugging zu erledigen, oder senden Sie Anforderungen für Auswahl - und Zugangsvorschläge.

Ingenieur Mitglied

Verwandeln Sie diesen Artikel in ein umsetzbares Debuggermaterial

Erweiterte Nachrichtenanalyse, Paket-Downloads, Codebeispiele, Engineering-Szenarien und Priority-Technischer Support sind für die Real-Projekt - Bereitstellung möglich.

Unbegrenzte Werkzeuge
Datenpaket und Codepaket
Vollständige Engineering Case-Basis
Vorrangiger Zugang zum technischen Support

Antwort veröffentlichen

Ihre E-Mail - Adresse wird nicht öffentlich gemacht. Erforderliche Elemente wurden verwendet * markiert.