Функция Pubnub xhr модуль вызывает конечную точку сервера несколько раз (он должен вызываться только один раз) - PullRequest
1 голос
/ 25 октября 2019

Я использую pubnub для связи между мобильными устройствами в режиме реального времени. Сценарий, который я создаю, выглядит следующим образом:

  1. Мобильное устройство отправителя опубликует сообщение на pubnub.
  2. Сообщение вызовет функцию On Before Function PubNub, на которую отправляется оригинальное сообщение. к конечной точке laravel, где она сохраняется и идентификатор записи базы данных добавляется к сообщению и публикуется для подписчика.

(конечная точка Laravel вызывается с использованием модуля xhr из функции PN)

Проблема, с которой я сталкиваюсь, заключается в том, что моя конечная точка 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)) ;
}

Пожалуйста, укажите, чтосовершенно неправильно.

1 Ответ

1 голос
/ 25 октября 2019

Публичная привязка функции функции PubNub

Ваша функция привязана к каналу '*', что, конечно, означает захват всех публикаций для всех каналов. Что вы не знаете, так это то, что console.log в функции публикует сообщение на канал, который выглядит следующим образом: blocks-output-kpElEbxa9VOgYMJQ.77042688368579w9

И окно вывода функций подписывается на этот канал для отображения вашего console.log«S. Поэтому, когда функция вызывается, она публикует сообщение на канал console.log s, которое захватывается вашей функцией, которое вызывает console.log, и, в конце концов, настраивается предел рекурсии, чтобы защитить вас от попадания в бесконечный цикл.

Таким образом, если бы вы изменили привязку своего канала на что-то вроде foo.* и опубликовали на канале, подобном foo.bar, этой нежелательной рекурсии можно было бы избежать. В производственной среде также необходимо удалить console.logs, и это не вызовет этого.

Кроме того, вы можете реализовать некоторые условия фильтра канала в верхней части вашей функции, чтобы предотвратить ее дальнейшее выполнение. Ваш код функции:

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