我正在编写一个Meteor应用程序,允许客户端通过单击按钮在服务器上执行终端命令。
我知道如何使用一个命令执行此操作:
//server
Meteor.methods({ exec : cmd => { ... } })
//client
Meteor.call('exec', cmd, (err, result) => {
console.log(result)
})
但是现在我正在尝试实现更复杂的协议,并且不太清楚最好的方法是什么。我希望客户端启动一系列命令,让服务器运行它们并一步一步地告诉我它们是成功还是失败。
显然,我可以通过上面的代码实现这一点,编写使用第一个命令运行exec
的客户端代码,检查服务器的结果,使用下一个命令运行exec
,依此类推
关键是在我的情况下,一系列命令总是相同的,所以在客户端只做一个Meteor.call
会更有意义 - 服务器会知道要运行什么命令。但是,我还想在客户端进入时提供各个命令的结果 - 这是我不能做的,因为Meteor.call
当然只返回一次。
我正在寻找的是一种流或迭代器,通过它我可以向客户端发送大量消息,直到完成所有操作。我已经看到了一些名为meteor-streams
的过时软件包,类似的可能会做类似的事情,但我认为Meteor本身必须有一种聪明的方法来解决这个问题。想法?
答案 0 :(得分:1)
常见的解决方案是Notifications
集合。使用架构创建集合:for: ${userid}, msg: ${msg string}, type: ${err success etc}
。创建通知发布,该发布使用用户userid
发布文档。
然后,您可以在客户端的某个主模板页面中订阅Notifications
集合。使用observeChanges
查找对集合的更改以及console.log它们,使用JavaScript在页面上显示它们,或者只是安装像sAlerts
这样的包来处理它们。
在observe更改回调中,应该调用seenNotification
方法从db中删除通知,因此不再显示。
稍后我会发布代码片段。
答案 1 :(得分:1)
看看这个:https://github.com/RocketChat/meteor-streamer
我认为它可以轻松解决您的问题。