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

Definition der Verarbeitungsfunktion

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.
Antwort veröffentlichen