是否可以在nodejs进程和Electron子进程之间进行通讯?

时间:2019-05-19 07:00:29

标签: node.js electron child-process spawn

我有一个在主nodejs应用程序内部启动的Electron应用程序。用户必须启动我的index.js,然后生成一个Electron窗口。问题是我无法在这两个过程之间进行沟通。

我正在使用spawn,因为fork无法与Electron一起使用。 Child.send不起作用。它什么都不做。

在我的index.js中:

let { spawn } = require("child_process")
let electron = spawn(require("electron"), ["."], {"detached": false, "cwd": "D:\\code\\electron_app", "env": {"some": JSON.stringify(["process", "env"])})
electron.send(JSON.stringify({
   message: "some message"
}))
electron.on("close", (code) =>{
   process.exit(code)
})
electron.on("exit", (code) => {
   process.exit(code)
})
electron.stdout.pipe(process.stdout)
electron.stdio.pipe(process.stdio)
electron.stdin.pipe(process.stdin)
electron.stderr.pipe(process.stderr)

在我的Electron应用程序的main.js中:

const {app, BrowserWindow} = require('electron')
let win = null

process.on("message", console.log)
//I haven't put all functions here

这什么也没做。 Electron应用程序正在启动,但消息未发送。甚至没有错误。我不知道是否还有其他方法可以实现。

2 个答案:

答案 0 :(得分:0)

Spawn不支持fork所支持的IPC通道(您正在尝试使用)。您将需要找到另一种与流程进行通信的方法,可能是通过TCP进行通信(您可以使用某些RPC实现或启动HTTP服务器来侦听目标进程中的请求)

答案 1 :(得分:0)

事实是,尽管NodeJ产生了电子过程,但是一旦产生了新的过程(在这种情况下为电子窗口过程),它就变得对父过程(在这种情况下为NodeJ)完全陌生,直到完成为止(成功或错误)并返回一些东西给父进程。因此,请勿中继IPC。

我假设这样一个事实,因为NodeJ不利于CPU密集型任务,因此您希望生成一些CPU密集型任务(现在在同一服务器上,但稍后在一些服务器较少的体系结构上)。

只需通过API端点进行通信即可。

在NodeJ中开发所需的REST端点,并在电子窗口进程中调用相同的端点,如果两者都在同一服务器上,则从子进程向localhost:port请求。

如果上面没有帮助,请在UX级别上共享您的问题说明(显示的方式/方式)。