【问题标题】:Is it possible to comunicate between a nodejs process and a Electron child process?节点js进程和Electron子进程之间是否可以通信?
【发布时间】:2019-10-05 21:53:01
【问题描述】:

我有一个在我的主 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 应用程序正在启动,但未发送消息。甚至没有错误。不知道有没有其他办法。

【问题讨论】:

  • 如果它必须是 IPC,您可以从电子主进程通过标准输出发送您的消息,然后您的节点进程从那里读取它。并且您的节点进程将其消息写入子进程的标准输入,电子主进程从那里读取它。

标签: node.js electron child-process spawn


【解决方案1】:

事实上,虽然 NodeJs 正在产生电子进程,但是一旦产生了新进程(在本例中为电子窗口进程),它就对父进程(在本例中为 NodeJs)变得完全陌生,直到它完成(成功或错误)并将某些内容返回给父进程。所以不要在 IPC 上中继。

我假设 NodeJs 不适合 CPU 密集型任务,因此您希望生成一些 CPU 密集型任务(现在在同一台服务器上,但稍后在一些服务器较少的架构上)。

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

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

如果以上没有帮助,请在 UX 级别分享您的问题陈述(您想展示什么/如何展示)。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2018-09-16
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 2017-11-08
      • 2010-09-20
      • 2014-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多