web-dev-qa-db-ja.com

vue.jsを使用したSpringStomp WebSocket

Spring WebSocket(STOMP)をVueで使用しようとしていますが、その方法やそれが可能かどうかがわかりません。私のWebSocketはプレーンJSで動作しますが、=で試してみるとVue行き詰まりました。これが私のvueコードです:

var app = new Vue({
el: '#app',
data: {
    stompClient: null,
    gold: 0
},
methods: {
    sendEvent: function () {
        this.stompClient.send("/app/hello", {}, JSON.stringify({'name': $("#name").val()}));
    }
},
created: function () {
    this.stompClient = Stomp.over(new SockJS('/gs-guide-websocket'));
    this.stompClient.connect()
    this.stompClient.subscribe('/topic/greetings', function (greeting) {
        console.log(JSON.parse(greeting.body).content);
    });
},

})

接続と送信機能が機能していて、バックエンドでメッセージを確認できますが、問題はサブスクライブ機能です。コールバック関数が必要ですが、これは起動しません。また、vueでメソッドを作成し、それを呼び出すことを試みました

this.stompClient.subscribe('/topic/greetings', vueFunc())

しかし、それも機能しません。 https://github.com/FlySkyBear/vue-stomp でいくつかのライブラリを見つけましたが、その使用方法がわからず、非常に面倒に見えます。その時はむしろプレーンJSを使用します。

誰かが解決策を得ましたか?ありがとう

7
pressbyron

これは、Spring Boot Websocket(STOMP)とVue CLIを使用した作業例です。(詳細な説明はこちら http://kojotdev.com/2019/07/using-spring- websocket-stomp-application-with-vue-js /

  1. Spring Bootデモを https://spring.io/guides/gs/messaging-stomp-websocket/ からダウンロードします。
  2. 許可されたオリジンをWebSocketConfigに追加します

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/gs-guide-websocket")
                .setAllowedOrigins("http://localhost:8081")
                .withSockJS();
    }
    
  3. プロジェクトを実行する

次に、Vue CLIプロジェクトを開始して:

  1. SockJSをインストールしますnpm install sockjs-client
  2. STOMPをインストールするnpm install webstomp-client
  3. 私はbootstrapクラスを使用しているので、レイアウトのためだけにnpm install bootstrap@3が必要です

.vueコンポーネントを追加します。

<template>
    <div>
        <div id="main-content" class="container">
            <div class="row">
                <div class="col-md-6">
                    <form class="form-inline">
                        <div class="form-group">
                            <label for="connect">WebSocket connection:</label>
                            <button id="connect" class="btn btn-default" type="submit" :disabled="connected == true" @click.prevent="connect">Connect</button>
                            <button id="disconnect" class="btn btn-default" type="submit" :disabled="connected == false" @click.prevent="disconnect">Disconnect
                            </button>
                        </div>
                    </form>
                </div>
                <div class="col-md-6">
                    <form class="form-inline">
                        <div class="form-group">
                            <label for="name">What is your name?</label>
                            <input type="text" id="name" class="form-control" v-model="send_message" placeholder="Your name here...">
                        </div>
                        <button id="send" class="btn btn-default" type="submit" @click.prevent="send">Send</button>
                    </form>
                </div>
            </div>
            <div class="row">
                <div class="col-md-12">
                    <table id="conversation" class="table table-striped">
                        <thead>
                            <tr>
                                <th>Greetings</th>
                            </tr>
                        </thead>
                        <tbody>
                            <tr v-for="item in received_messages" :key="item">
                                <td>{{ item }}</td>
                            </tr>
                        </tbody>
                    </table>
                </div>
            </div>
        </div>
    </div>
</template>

<script>
import SockJS from "sockjs-client";
import Stomp from "webstomp-client";

export default {
  name: "websocketdemo",
  data() {
    return {
      received_messages: [],
      send_message: null,
      connected: false
    };
  },
  methods: {
    send() {
      console.log("Send message:" + this.send_message);
      if (this.stompClient && this.stompClient.connected) {
        const msg = { name: this.send_message };
        this.stompClient.send("/app/hello", JSON.stringify(msg), {});
      }
    },
    connect() {
      this.socket = new SockJS("http://localhost:8080/gs-guide-websocket");
      this.stompClient = Stomp.over(this.socket);
      this.stompClient.connect(
        {},
        frame => {
          this.connected = true;
          console.log(frame);
          this.stompClient.subscribe("/topic/greetings", tick => {
            console.log(tick);
            this.received_messages.Push(JSON.parse(tick.body).content);
          });
        },
        error => {
          console.log(error);
          this.connected = false;
        }
      );
    },
    disconnect() {
      if (this.stompClient) {
        this.stompClient.disconnect();
      }
      this.connected = false;
    },
    tickleConnection() {
      this.connected ? this.disconnect() : this.connect();
    }
  },
  mounted() {
    // this.connect();
  }
};
</script>

<style scoped>

</style>

プロジェクトを実行してテストします。デフォルトでは8081ポートから開始する必要があります。

22
kojot

私も同じ状況です...

ここに実用的な解決策があるようです:

https://github.com/ocinpp/springboot-sockjs-stomp-vue-sample

1
Maikel Nait