Pubnub 函数 xhr 模块多次调用服务器端点(它应该只调用一次)
Pubnub function xhr module is calling server endpoint multiple times ( it should call only one time )
我一直在使用 pubnub 在移动设备之间进行实时通信。
我创建的场景如下:
- 发件人移动设备将向 pubnub 发布消息。
- 消息会调用一个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.log
s 通道发布一条消息,该通道由您的函数捕获,该函数调用 console.log
并最终达到配置的递归限制以保护您免于进入无限循环。
因此,如果您要将频道绑定更改为 foo.*
之类的内容并发布到 foo.bar
之类的频道,则可以避免这种不需要的递归。在生产中,console.logs 也应该被删除,它不会导致这种情况发生。
此外,您可以在您的函数顶部实现一些通道过滤条件,以防止它进一步执行您的函数代码:
if (channel.startsWith("blocks-output"))
return request.ok()
}
我一直在使用 pubnub 在移动设备之间进行实时通信。 我创建的场景如下:
- 发件人移动设备将向 pubnub 发布消息。
- 消息会调用一个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.log
s 通道发布一条消息,该通道由您的函数捕获,该函数调用 console.log
并最终达到配置的递归限制以保护您免于进入无限循环。
因此,如果您要将频道绑定更改为 foo.*
之类的内容并发布到 foo.bar
之类的频道,则可以避免这种不需要的递归。在生产中,console.logs 也应该被删除,它不会导致这种情况发生。
此外,您可以在您的函数顶部实现一些通道过滤条件,以防止它进一步执行您的函数代码:
if (channel.startsWith("blocks-output"))
return request.ok()
}