Ich habe eine Elektronen-App, bei der ich nicht nur die Schnittstelle zum Benutzer ausführen, sondern auch einen Express-Server starten muss, der Dateien für Personen bereitstellt, die über das Netzwerk verbunden sind.
Ich habe alles funktioniert, wenn ich sowohl das Elektron als auch den Express-Server normal starte, aber ich bin ziemlich zuversichtlich, dass ich den Server in einem anderen Thread laufen lassen muss, um eine schlüssige Schnittstelle und sogar Probleme mit dem Server zu vermeiden.
Dafür habe ich versucht, meinen express-Server mit der child_process.fork zu starten, und es funktionierte, wenn ich npm start
verwende, aber wenn ich electron-builder
verwende, um eine .exe zu erstellen, startet das installierte Programm den Express nicht Server.
Ich habe versucht, meinen Server sofort zu starten mit:
require('child_process').fork('app/server/mainServer.js')
Ich habe mehrere Änderungen versucht, indem ich der Datei __dirname
, process.resourcesPath
voranstellte und sogar den generierten Dateipfad hart codierte; Ändern der Fork-Optionen zum Übergeben von cwd: __dirname
, detached: true
und stdio: 'ignore'
; und versuchte sogar, spawn
mit process.execPath
zu verwenden, was auch mit npm start
funktioniert, aber nicht beim Packen (es öffnet immer neue Instanzen meiner App, scheint offensichtlich, nachdem du hehe)
Hinweis: Wenn ich nicht forkiere und das Server-Skript sofort benötige, funktioniert die Verwendung von require('server/mainServer.js')
in der gepackten App, daher ist das Problem, das am meisten gefällt, nicht das Express selbst.
Hinweis 2: Ich habe asar: false
, um andere Probleme zu lösen, daher ist dies hier nicht der Problemlöser.
Ich habe ein kleines Git-Projekt hochgeladen, um mein Problem zu zeigen:
Jede Hilfe wird sehr geschätzt.
Mit der großen Hilfe von Samuel Attard ( Ссылка ) konnte ich das Problem lösen (er löste sich tatsächlich für mich)
>Wie er sagte:
%Vor% Mit anderen Worten. fork
ist eigentlich spawn
wird mit process.execPath
ausgeführt und übergibt das erste Argument der Verzweigung als zweites für den Spawn.
Was in einer verpackten App passiert, ist, dass process.execPath
kein Elektron ist, sondern die verpackte App selbst. Wenn Sie also spawn
versuchen, wird die App immer wieder geöffnet.
Also, was Samuel vorgeschlagen hat, wurde so umgesetzt:
%Vor% Auf diese Weise wird das process.argv[1]
beim ersten Ausführen der gepackten App leer sein, sodass der Server nicht gestartet wird. Es führt dann den Elektronenteil (in meinem Fall mainLocal) aus und startet die App über, aber dieses Mal übergibt es argv
. Beim nächsten Start der App wird der Server gestartet und die Ausführung gestoppt. Die App wird daher nicht mehr geöffnet, da der Spawn nie erreicht wird.
Vielen Dank an Samuel.
Tags und Links node.js express child-process electron