/ / child_process.fork não inicia um servidor expresso dentro do aplicativo eletrônico empacotado - node.js, express, electron, child-process

child_process.fork não inicia um servidor expresso dentro do aplicativo eletrônico empacotado - node.js, express, electron, child-process

Eu tenho um aplicativo eletrônico onde eu preciso não só para executar a interface para o usuário, mas também iniciar um servidor expresso que servirá arquivos para pessoas conectadas através da rede.

Eu tenho tudo funcionando se eu começar os doisElectron e o servidor expresso normalmente, mas estou bastante confiante de que precisarei do servidor rodando em um thread diferente para evitar a interface slugish e até problemas com o servidor.

Para essa questão, eu tentei executar o meu servidor expresso usando o child_process.fork e funcionou quando eu uso npm start, mas quando eu uso electron-builder para criar um .exe, o programa instalado não inicia o servidor expresso.

Eu tentei executar meu servidor imediatamente usando:

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

Eu tentei várias alterações, prefixando o arquivo com __dirname, process.resourcesPath e até mesmo codificar o caminho do arquivo gerado; mudando as opções do garfo para passar cwd: __dirname, detached: true e stdio: "ignore"; e até tentei usar spawn com process.execPath, que também funcionará com npm start mas não ganhou quando empacotado (ele mantém abrindo novas instâncias do meu aplicativo, parece óbvio depois que você faz hehe)

Nota: Se eu não forjar e exigir o script do servidor imediatamente, use require("server/mainServer.js") funciona no aplicativo empacotado, então o problema mais parecido não é o expresso em si.

Nota 2: tenho asar: false para resolver outros problemas, então este não é o solucionador de problemas aqui.

Eu coloquei um pequeno projeto git para mostrar o meu problema:

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

Qualquer ajuda será muito apreciada.

Respostas:

5 para resposta № 1

Com a grande ajuda de Samuel Attard (https://github.com/MarshallOfSound) Consegui resolver o problema (ele resolveu para mim na verdade)

Como ele disse:

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

Em outras palavras. fork é na verdade spawn sendo executado com process.execPath e passando o primeiro argumento do fork como o segundo para spawn.

O que acontece em um aplicativo empacotado é que o process.execPath não é eletrônica, mas o próprio aplicativo empacotado. Então, se você tentar spawn, o aplicativo será aberto uma e outra vez.

Então, o que Samuel sugere foi implementado assim:

if (process.argv[1] === "--start-server") {
require("./server/mainServer.js")
return
}

require("./local/mainLocal.js")
require("child_process").spawn(process.execPath, ["--start-server"])

Dessa forma, a primeira vez que o aplicativo empacotado será executado, o process.argv[1] estará vazio, então o servidor não irá iniciar. Ele irá então executar a parte eletrônica (mainLocal no meu caso) e reiniciar o aplicativo, mas desta vez passando o argv. Na próxima vez em que o aplicativo for iniciado, ele iniciará o servidor e interromperá a execução, para que o aplicativo não seja aberto novamente porque o spawn nunca é alcançado.

Muito obrigado a Samuel.