【问题标题】:Is it possible to build a headless Node-based client from Meteor?是否可以从 Meteor 构建基于节点的无头客户端?
【发布时间】:2017-04-08 10:59:15
【问题描述】:

我正在开发一个系统,通过 Meteor 应用程序控制远程机器(连接到投影仪和其他一些硬件)。目前,我们正在使用用 C++ 编写的本土 DDP 客户端来实现这一点,但这种方法并不像我想要的那样灵活:

  • C++ 和 JavaScript 之间存在重复。
  • 升级很困难,因为我们不能同时部署服务器和客户端,所以我们总是要考虑向后兼容性和顺序。

所以我正在考虑用 JavaScript 重写 C++ 应用程序的 Meteor 部分。理想情况下,我希望有一个我们的应用程序的特殊客户端(称为headless,类似于serverclient):

  • 与 Meteor 应用程序的其余部分使用相同的源构建,因此我们可以重用与服务器和 Web 客户端上相同的业务逻辑,
  • 在客户端机器上的 Node.js 中运行,因此它可以访问操作系统,并且
  • 不包含任何浏览器代码,但添加了一些其他特定于控制机器和与 C++ 应用程序通信的代码。

如果这个客户端不包含任何实际代码,而只是一段引导代码,那就更好了。引导程序将从服务器下载实际的应用程序代码,并在服务器更新时重新下载,这与 HTML 客户端的情况相同。这将使更新更容易,因为我们可以假设服务器和客户端始终运行相同的版本。

这样的事情存在吗?如果不是,我可以在不付出不合理努力的情况下接近多远?搜索“meteor headless client”和“meteor node client”对我没有帮助,我能找到的 only somewhat related question 也没有得到很好的回答。

【问题讨论】:

  • 嗯,这不会是微不足道的。您可能需要以某种方式在构建中添加一个新平台(我认为它没有在任何地方记录,并且可能涉及分叉 Meteor)或在构建 Meteor 时构建您的包。我不确定您到底打算包括什么,但是单独构建它并在有新捆绑包要下载时提示您的节点客户端可能是一种更合理的方式。然后,您甚至可以提取包并在运行时加载代码或使用新源重新启动节点。
  • 你有没有考虑过使用DDP.connect来连接两个meteor server?除了引导,我认为它会解决你的问题。在某种程度上,DDP.connect 正是您用来让另一台服务器连接到另一台服务器的方式,就像客户端一样。如果构建得当,两台服务器的代码库实际上可以相同——Meteor.settings 值可以指示主服务器和从服务器。
  • 我喜欢一个新平台的想法,尽管这可能属于“不合理的努力”类别......至于代码包更新,这听起来很像 Meteor 为 Cordova 客户提供的。最后,在我看来,这样的用例满足了 Meteor 对更多模块化/灵活性的需求(例如指定新平台的能力)。
  • 进一步与 Cordova 客户端进行类比,与您的 C++ 部分通信的特定代码就像一个 Cordova 插件:一个独立的模块,将“本机”功能暴露给业务逻辑。
  • 这听起来很有趣。客户端是否必须在 c++ 中,还是可以在 javascript 中完成?或者硬件接口可以用c++完成,提供一个api给一个流星服务器?两个流星服务器可以使用 DDP 进行通信。您能否重构代码以将大部分智能功能放在主流星服务器中,并让硬件控制器只专注于控制硬件(减少对其进行更新的需要?)

标签: node.js meteor


【解决方案1】:

远程机器上是否有带有自定义硬件的常规流星客户端?还是 C++ 程序充当客户端?然后是服务器,除了你的其他客户端浏览器?

听起来你实际上应该做一些不同的事情:

  • 设置具有自定义域和端口转发的动态 DNS 系统,以便您可以将特殊硬件远程系统用作服务器。

  • 在带有硬件的远程机器上运行 Meteor 服务器。

  • 只需制作一个与硬件对话的 Node.js C++ 插件并在 Meteor 服务器代码中使用它即可,而不是一个完整的 C++ 应用程序使用 DDP。

【讨论】:

  • C++ 程序充当客户端,使用我编写的 DDP 客户端(那里没有一个好的客户端——需要与人们讨论开源它的问题!)。但是您似乎误解了-远程系统是客户端,而不是服务器。会有不止一个,而且它们并不完全受信任。
【解决方案2】:

您应该能够通过使用meteor-desktop 包来构建您的远程无头客户端来使其工作。

https://www.npmjs.com/package/meteor-desktop#architecture

在 Electron 应用程序中,您的应用程序中有两个进程在运行。 所谓主进程和渲染器进程。主要过程只是 一个在node中执行的JS代码,渲染器是一个Chromium进程。在 此集成您的 Meteor 应用程序正在渲染器进程中运行 并且您的桌面特定代码在主进程中运行。他们是 通过 IPC 事件进行通信。基本上,桌面端 将其 API 发布为 IPC 事件侦听器。在你的 Meteor 代码中, 调用它就像 Desktop.send('module', 'event'); 一样简单。

这会给你:

  • 在此(桌面)客户端上的操作系统访问权限
  • hot code push(关于节点模块的警告)
  • 提供Meteor.isDesktop 来控制哪些代码在浏览器和桌面客户端上运行

【讨论】:

  • 这看起来很有希望!我可能需要移除/禁用 Electron 位,但也许我们实际上可以充分利用 Electron(毕竟机器上也连接了一个投影仪)。谢谢!
【解决方案3】:

如果您希望将 Meteor 客户端用作无头客户端,并且由于客户端在浏览器中运行,我建议您使用像 PhantomJS 这样的无头浏览器,它可以运行您的 Meteor无需UI的代码,并具有访问本地文件系统的能力。

另一个选项,这不是你真正描述的,但会让一切都变成javascript,是使用节点ddp 客户端,并将你的代码编写在你可以在节点端轻松导入的模块中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    相关资源
    最近更新 更多