黑客流星 DDP

黑客流星 DDP

原文:https://medium.com/hackernoon/hacking-meteor-ddp-9da37790b37b

the meteor by ready2freeze

TD;DR,通过监控Meteor . connection . _ stream来跟踪通过您的 Meteor 应用程序的 DPP 连接的所有消息。

在 Meteor 上创建功能测试可能是一件痛苦的事情。它的反应对 UX 来说很好,但当我们谈论功能测试时,事情会变得复杂。

在我一直在做的这个项目中,我们使用夜巡来编写我们的功能测试。这个工具Selenium 服务器上运行浏览器测试,并允许我们用 Nodejs 编写测试规范。

几周前,我试图弄清楚如何在触发项目网站页面上某个按钮上的 click 命令之前等待 Meteor 方法的结果。

等待这个结果并不容易。另外,我们尽量避免使用 Nightwatch 提供的 暂停命令

当有人推断等待一个计算完成需要多少时间时,会发生很多不好的事情,例如,在提交表单后等待一些 CSS 类被添加到一个 div 中。

因为暂停不是一个选项,我需要另一种方式来等待这个方法的结果。经过一些调查,我想出了监听 DDP 消息的主意。

流星的 DDP

DDP 是 Meteor 的内置发布/订阅和 RPC 协议

互联网上已经有很多文章可以很好地向您介绍 DDP 协议。你也可以在 Meteor 的文档中阅读更多关于 DDP 的内容,链接这个链接

简而言之,DDP 是一个基于 JSON 的协议,它是由 MeteorSockJS 之上实现的。它用于在客户端和服务器之间创建全双工通信,在此通信中,它可以更改数据并对其更改做出反应。

SockJS 是一个模拟 WebSockets 的 Javascript 库

当你使用 Meteor.method,Meteor.callMeteor.publishMeteor.subscribe 时,Meteor 在底下使用的是 DDP。

监听 DDP 消息

通过在 Meteor 全局对象上访问名为 _stream 的变量,可以在客户端找到由 Meteor 创建的 DDP 连接:

Meteor.connection._stream

有了这个对象,我们可以在客户端发送和监听任何我们想要的消息。下面的要点展示了一个非常简单的代码示例:

首先,我们保存对原始发送方法的引用。

然后我们用期望的函数覆盖发送方法。在这个例子中,它只是在通过最初的 send 方法将消息发送到服务器后打印消息。

最后,我们为消息事件注册了一个新的监听器,它也将打印从服务器接收到的所有内容。以前注册的所有侦听器都不会受到影响。

如果您有一个 Meteor 应用程序,您可以将这个片段复制并粘贴到您的浏览器控制台上,它将开始跟踪通过 DDP 的所有内容。

您可能注意到的第一件事是乒乓消息。Meteor 在一段时间间隔后继续发送这些消息,以检查连接是否仍然有效。

> {"msg":"pong"}
> {"msg":"ping"}

等待方法响应

你可能会在流中找到我的消息类型。您可以通过浏览您的应用程序并监视控制台中发生的事情来检查这一点。

我使用带有类型方法的消息从我的测试中移除对暂停命令的依赖。测试现在等待,直到结果消息到达,在一些时间间隔内在浏览器控制台中搜索它。

Meteor.call('foo');> {"msg":"method", "method":"foo", "params":[], "id":"42"}> {"msg":"result", "id":"42", "result":[{"a":1}, {"b":2}]}

结果不包括方法名,但是可以在方法消息中找到,作为方法属性的值。它们通过 id 属性链接在一起。

这同样适用于等待订阅准备就绪。

Meteor.subscribe('bar');> {"msg":"sub", "id":"abc1def3", name:"bar", params:[]}> {msg:"ready", subs:["abc1def3"]}

结论

除了功能测试之外,你还可以用这个 Meteor Hack 做一些很酷的事情:

  • 排除故障
  • 查找内存泄漏
  • 分析安全问题

参考

黑客中午是黑客如何开始他们的下午。我们是 @AMI 家庭的一员。我们现在接受投稿,并乐意讨论广告&赞助机会。

如果你喜欢这个故事,我们推荐你阅读我们的最新科技故事趋势科技故事。直到下一次,不要把世界的现实想当然!


本站为非盈利网站,作品由网友提供上传,如无意中有侵犯您的版权,请联系删除