child_process.fork non sta avviando un server express all’interno dell’app electron pacchettizzata

Ho un’app di elettroni in cui ho bisogno non solo di eseguire l’interfaccia per l’utente, ma anche di avviare un server express che servirà i file per le persone connesse attraverso la rete.

Ho tutto a posto se avvio normalmente sia il server elettronico che quello elettronico, ma sono abbastanza fiducioso che avrò bisogno che il server funzioni in un thread diverso per evitare un’interfaccia slanciata e persino problemi con il server.

Per questo motivo ho cercato di eseguire il mio server express utilizzando child_process.fork e ha funzionato quando uso npm start , ma quando uso electron-builder per creare un file .exe, il programma installato non avvia il server express.

Ho provato ad eseguire il mio server subito utilizzando:

require('child_process').fork('app/server/mainServer.js')

Ho provato diverse modifiche, aggiungendo il prefisso al file con __dirname , process.resourcesPath e persino hard coding del percorso del file generato; cambiare le opzioni di fork per passare cwd: __dirname , detached: true e stdio: 'ignore' ; e anche provato a usare spawn con process.execPath , che funzionerà anche con npm start ma non quando sarà pacchettizzato (continua ad aprire nuove istanze della mia app, sembra ovvio dopo averlo fatto)

Nota: se non require('server/mainServer.js') fork e richiedo subito lo script del server, utilizzando require('server/mainServer.js') funziona sull’app impacchettata, quindi il problema più simile non è l’express stesso.

Nota 2: Ho asar: false per risolvere altri problemi, quindi questo non è il risolutore di problemi qui.

Ho creato un piccolo progetto git per mostrare il mio problema:

https://github.com/victorivens05/electron-fork-error

Qualsiasi aiuto sarà molto apprezzato.

Con l’aiuto di Samuel Attard ( https://github.com/MarshallOfSound ) sono stato in grado di risolvere il problema (ha risolto per me in realtà)

Come ha detto:

 the default electron app will launch the first file path provided to it so `electron path/to/thing` will work in a packaged state, that launch logic is not present it will always run the app you have packaged regardless of the CLI args passed to it you need to handle the argument manually yourself and launch that JS file if it's passed in as the 1st argument The first argument to fork simply calls `process.execPath` with the first argument being the path provided afaik The issue is that when packaged Electron apps don't automatically run the path provided to them they run the app that is packaged within them 

In altre parole. fork è in realtà spawn viene eseguito con process.execPath e passa il primo argomento della fork come secondo per spawn.

Quello che succede in un’app pacchettizzata è che process.execPath non è un elettrone ma l’app impacchettata stessa. Quindi se provi a spawn , l’app sarà aperta più e più volte.

Quindi, quello che Samuel suggerisce è stato implementato in questo modo:

 if (process.argv[1] === '--start-server') { require('./server/mainServer.js') return } require('./local/mainLocal.js') require('child_process').spawn(process.execPath, ['--start-server']) 

In questo modo, la prima volta che verrà eseguita l’app in pacchetto, process.argv[1] sarà vuoto, quindi il server non verrà avviato. Quindi eseguirà la parte electron (mainLocal nel mio caso) e avvierà l’app, ma questa volta passa l’ argv . La prossima volta che l’app verrà avviata, avvierà il server e interromperà l’esecuzione, quindi l’app non si riaprirà perché lo spawn non viene mai raggiunto.

Enorme grazie a Samuel.