【问题标题】:Pubnub function xhr module is calling server endpoint multiple times ( it should call only one time )Pubnub 函数 xhr 模块多次调用服务器端点(它应该只调用一次)
【发布时间】:2019-10-25 12:40:29
【问题描述】:

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

  1. 发件人移动设备将向 pubnub 发布消息。
  2. 消息将调用 On Before Function PubNub 函数,其中原始 消息被发送到 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)) ;
}

请确定到底哪里错了。

【问题讨论】:

  • 你能显示显示它多次调用的日志吗?
  • 我们收到了您的支持票,我们将继续在那里与您合作,并在此处回复回复。

标签: javascript ajax pubnub


【解决方案1】:

PubNub 函数通配符通道绑定

您的函数绑定到频道'*',这当然意味着捕获所有发布到所有频道。你不知道的是,Function 中的console.log 将消息发布到一个看起来像这样的通道:blocks-output-kpElEbxa9VOgYMJQ.77042688368579w9

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多