Ошибка: невозможно отправить, пока транспорт не подключен - SignalR

Я использую signalR в своем родном приложении для комментариев к сообщению. Когда я впервые пытаюсь подключиться и прокомментировать запись, получаю сообщение Ошибка: Невозможно отправить, пока не будет подключен транспорт. Но после этого первого раза он работает гладко. Я попробовал такие библиотеки, как @aspnet/signalr и @microsoft/signalr. То же самое происходит с обеими библиотеками. По-моему, у меня проблема с подключением.

Поскольку мне нужен сигнал в разных областях моего приложения, например, в комментариях, уведомлениях и сообщениях, я создаю соединение таким образом.

import {HubConnectionBuilder, LogLevel} from '@aspnet/signalr';

var connection_count = 0;
export const connectionSignalR = async (endPoint, token) => {
  return new Promise((resolve, reject) => {
    let _hubConnection = new HubConnectionBuilder()
      .withUrl(
        `http://www.XXXXXXX.com/${endPoint}?access_token=${token}`,
      )
      .configureLogging(LogLevel.Debug)
      .build();
    const startConnection = async () => {
      await _hubConnection.start();
      console.log('[SignalR Connection State]:', _hubConnection.state);
      if (_hubConnection.state === 1) {
        connection_count = 0;
        resolve(_hubConnection);
      } else {
        console.log('[Error with connection signalR]:   ');
        if (connection_count < 3) {
          connection_count = connection_count + 1;
          console.log('[Trying to connection again]:');
          startConnection();
        } else {
          connection_count = 0;
          reject('Error in connection');
        }
      }
    };

    startConnection();
  });
};

Эта функция возвращает экземпляр соединения, и я выполняю дальнейший процесс, подобный этому

import {connectionSignalR} from '@services';

connectionSignalR('Comments', Token)
  .then(hubConnection => {
    let data = {
      UserId: 'XXX',
      Comment: 'My first Comment',
      PostId: 'XXXX',
    };
    hubConnection.invoke('AddCommentAsync', data).then(() => {
      hubConnection.on('AddComment', res => {
        console.log('[Response from add comment]', res);
      });
    });
  })
  .catch(error => {
    Toast.show('Network error!', error);
  });

person Ghayoor ul Haq    schedule 23.09.2020    source источник


Ответы (1)


Прежде всего, вы должны использовать пакет @microsoft/signalr, потому что другой устарел, и это пакет, который поддерживается и получает обновления.

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

hubConnection.on('AddComment', res => {
        console.log('[Response from add comment]', res);
      });

Так что это должно быть что-то вроде этого:

let _hubConnection = new HubConnectionBuilder()
      .withUrl(
        `http://www.XXXXXXX.com/${endPoint}?access_token=${token}`,
      )
      .configureLogging(LogLevel.Debug)
      .build();

hubConnection.on('AddComment', res => {
        console.log('[Response from add comment]', res);
      });
person Kiril1512    schedule 23.09.2020
comment
Спасибо за ваш ответ. Проблема решена. Я регистрировал слушателя после запуска соединения. - person Ghayoor ul Haq; 23.09.2020