【问题标题】:Is ZeroMQ for Node.js compatible with Electron?用于 Node.js 的 ZeroMQ 是否与 Electron 兼容?
【发布时间】:2016-11-21 05:54:23
【问题描述】:

试图让ZMQ Node bindings 与 Electron 一起工作让我非常头疼,尤其是在 Windows 上。我正在使用 Windows 7 和 Ubuntu 16.04,它们都有两个不同的问题。

在 Windows 上,当我尝试执行 require('zmq') 时出现错误

C:\vueelectron\app\node_modules\bindings\bindings.js:91 Uncaught Error: Could not locate the bindings file. Tried:
 → C:\vueelectron\app\node_modules\zmq\build\zmq.node
 → C:\vueelectron\app\node_modules\zmq\build\Debug\zmq.node
 → C:\vueelectron\app\node_modules\zmq\build\Release\zmq.node
 → C:\vueelectron\app\node_modules\zmq\out\Debug\zmq.node
 → C:\vueelectron\app\node_modules\zmq\Debug\zmq.node
 → C:\vueelectron\app\node_modules\zmq\out\Release\zmq.node
 → C:\vueelectron\app\node_modules\zmq\Release\zmq.node
 → C:\vueelectron\app\node_modules\zmq\build\default\zmq.node
 → C:\vueelectron\app\node_modules\zmq\compiled\6.1.0\win32\x64\zmq.node

我尝试使用 VS 2013 和 2015 进行编译,多次重建,使用 electron-rebuild 似乎没有任何效果。

在 Linux 上它可以正常加载,但问题是当我发送消息时,它似乎卡在某个地方的循环中,它不断发送数百条消息,并且无限期地继续这样做。 问题已通过从 Ubuntu 存储库中的 ZMQ 版本升级到从 ZeroMQ 网站下载的最新版本来解决。

这是我在 Electron 应用程序的 index.html 文件中使用的代码。

const electron = require('electron')
const zmq = require('zmq')

const socket = zmq.socket('req')
socket.connect('tcp://10.10.0.51:3111')

socket.on('message', function (data) {
  console.log(socket.identity + ': answer data ' + data)
})

socket.send('test')

还有其他人能够让 Electron + ZMQ 工作吗?如果是这样,您的开发环境是什么样的?谢谢。

【问题讨论】:

  • 我的回答中添加了详细说明,请查收。

标签: javascript node.js zeromq electron


【解决方案1】:

问题在于 Electron 和您的 node 版本不匹配的 node.js 二进制文件。长答案是您需要使用相同的 Node.js 标头编译 Electron 和 ZeroMQ。这是来自电子社区http://github.com/electron/electron/issues/6805 的回复。不过现在有一个简短的答案!

使用zeromq 代替zmq(相同的API)。 zeromq 为 OS X、Windows 和 macOS/OS X 的 electron 和 node.js 提供预构建的二进制文件。安装 zeromq 后,为您正在使用的 electron 版本重新构建:

npm rebuild zeromq --runtime=electron --target=1.4.5

感谢 zeromq.js 团队,让 ZeroMQ 玩得开心!

【讨论】:

  • 感谢您的回复,但链接已关闭。我能够通过使用 electron-builder 解决我的问题,我不确定它有什么不同,但它现在可以正常工作。
  • 我们又做了一步,让您更轻松——zmq-prebuilt(重命名为 zeromq.js,npm 上的 zeromq)现在为电子版本提供预构建的二进制文件:github.com/zeromq/zeromq.js#rebuilding-for-electron跨度>
【解决方案2】:

将对队列的访问置于 api 层之后可能更安全。您可能在稳定性方面也取得了更好的成功,electron 中的原生模块可能非常棘手。

但我的意思是有一个 REST 服务器,您的电子应用程序可以与之通信。它会向该 api 发送一条消息,然后该 api 为您的应用程序将消息排队。在网络级别限制对队列的访问仅限于 api 服务器。

【讨论】:

  • 感谢您的回复,我实际上来自那个场景。但是我们正试图将延迟保持在最低限度,并且我们尝试的所有 HTTP 服务器都增加了至少 30 毫秒左右。这也是我想避免的额外复杂层。奇怪的是让它在 Linux 和 Mac 上运行是多么容易。
  • 我很欣赏这个想法。但是如何让api层透明呢?例如。我有一个带有大量 zmq 代码的纯 node.js 应用程序。现在我必须为 Electron 应用程序添加一个 api 层。我不想过多更改现有代码,只需将所有require("zmq") 替换为require("zmq-bridge")。我要检查每一个方法并一一做映射吗?
猜你喜欢
  • 1970-01-01
  • 2017-04-25
  • 1970-01-01
  • 2021-10-04
  • 2013-09-18
  • 1970-01-01
  • 2017-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多