Pubnub 函数 xhr 模块多次调用服务器端点(它应该只调用一次)

Pubnub function xhr module is calling server endpoint multiple times ( it should call only one time )

我一直在使用 pubnub 在移动设备之间进行实时通信。 我创建的场景如下:

  1. 发件人移动设备将向 pubnub 发布消息。
  2. 消息会调用一个On Before Function PubNub Function where original 消息被发送到 laravel 端点,在那里它被持久化并且 数据库记录 ID 添加到消息中并发布给订阅者。

(Laravel 端点使用 PN 函数中的 xhr 模块调用)

我面临的问题是我的 laravel 端点在每次发布消息时被调用大约 7 到 12 次。

下面是我的 onBefore PubNub 函数。

export default (request) => { 
    console.log('intial message: ',request.message);
    const kvstore = require('kvstore');
    const xhr = require('xhr');
    const http_options = {
        "timeout": 5000, // 5 second timeout.
        "method": "POST",
        "body": "foo=bar&baz=faz"
    };

    const url = "redacted_backend_url";

    return xhr.fetch(url,http_options).then((x) => {
        console.log('Messages after calling ajax: ',request.message.content);
        // here i am changing the message
        request.message.content = 'hello world'; 
        return request.ok();
    }).catch(err=>console.log(err)) ;
}

请指出具体错误。

PubNub 函数通配符通道绑定

您的函数绑定到频道 '*',这当然意味着捕获所有频道的所有发布。您不知道的是,函数中的 console.log 将消息发布到如下所示的通道:blocks-output-kpElEbxa9VOgYMJQ.77042688368579w9

并且函数输出 window 订阅了该频道以显示您的 console.log。因此,当函数被调用时,它会向 console.logs 通道发布一条消息,该通道由您的函数捕获,该函数调用 console.log 并最终达到配置的递归限制以保护您免于进入无限循环。

因此,如果您要将频道绑定更改为 foo.* 之类的内容并发布到 foo.bar 之类的频道,则可以避免这种不需​​要的递归。在生产中,console.logs 也应该被删除,它不会导致这种情况发生。

此外,您可以在您的函数顶部实现一些通道过滤条件,以防止它进一步执行您的函数代码:

if (channel.startsWith("blocks-output"))
    return request.ok()
}