Не удается отправить данные, если соединение не находится в состоянии «Подключено» | SignalR, Vuejs

#vue.js #signalr #signalr-hub

Вопрос:

Я искал здесь похожие темы, но до сих пор не решил свою проблему. Может быть, кто-нибудь сможет мне в этом помочь.

Моя цель-отобразить журналы из различных служб. Для этого я использую SignalR с vuejs в качестве клиента. Я хочу подключиться к группе служб по нажатию кнопки и получить журналы. Когда я нажимаю на другую кнопку, я хочу покинуть группу и присоединиться к другой.

 selectItem(name) {
  this.groups.push(name)
  document.getElementById('messageList').innerHTML = ''
      
  const connection = new signalR.HubConnectionBuilder()
  .withUrl("http://localhost:5000/logs")
  .configureLogging(signalR.LogLevel.Information)
  .build()

  if (this.groups.length > 1) {
    let previousGroup = this.groups[this.groups.length - 2]
    connection.invoke("LeaveGroup", previousGroup)
    console.log('leaving group:', previousGroup)
  }

  connection.on("PushEventLog", (message) => {
    const div = document.createElement('div')
    div.textContent = message
    document.getElementById('messageList').appendChild(div)
  })

  connection.start().then(() => {
    connection.invoke("JoinGroup", name)
    console.log('joining group: ', name)
  })
}
 

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

Какая-нибудь помощь?

Ответ №1:

Вы создаете новое соединение каждый раз selectItem при запуске. Вы должны где-то хранить объект подключения и использовать его только после его запуска.

Добавил пару комментариев к вашему коду, чтобы указать, что вы делаете неправильно.

 // new connection object
const connection = new signalR.HubConnectionBuilder()
  .withUrl("http://localhost:5000/logs")
  .configureLogging(signalR.LogLevel.Information)
  .build()

  if (this.groups.length > 1) {
    let previousGroup = this.groups[this.groups.length - 2]
    // using new connection that hasn't started yet
    connection.invoke("LeaveGroup", previousGroup)
    console.log('leaving group:', previousGroup)
  }
 

Ответ №2:

Я нашел решение — я переместил соединение и журналы в созданный крюк. Рабочий код ниже.

 methods: {
  selectItem(name, i) {
    this.groups.push(name)
    document.getElementById('messageList').innerHTML = ''

    if (this.groups.length > 1) {
      let previousGroup = this.groups[this.groups.length - 2]
      this.connection.invoke("LeaveGroup", previousGroup)
    } else {
      this.connection.invoke("JoinGroup", name)
    }
  }
}
created() {
  this.connection = new signalR.HubConnectionBuilder()
  .withUrl("http://localhost:5000/logs")
  .build()

  this.connection.start()

  this.connection.on("PushEventLog", (message) => {
    const div = document.createElement('div')
    div.textContent = message
    document.getElementById('messageList').appendChild(div)
  })
}