【发布时间】:2017-04-08 10:59:15
【问题描述】:
我正在开发一个系统,通过 Meteor 应用程序控制远程机器(连接到投影仪和其他一些硬件)。目前,我们正在使用用 C++ 编写的本土 DDP 客户端来实现这一点,但这种方法并不像我想要的那样灵活:
- C++ 和 JavaScript 之间存在重复。
- 升级很困难,因为我们不能同时部署服务器和客户端,所以我们总是要考虑向后兼容性和顺序。
所以我正在考虑用 JavaScript 重写 C++ 应用程序的 Meteor 部分。理想情况下,我希望有一个我们的应用程序的特殊客户端(称为headless,类似于server 和client):
- 与 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 进行通信。您能否重构代码以将大部分智能功能放在主流星服务器中,并让硬件控制器只专注于控制硬件(减少对其进行更新的需要?)