弹簧stolds websockets与vue.js

时间:2017-10-18 20:26:38

标签: javascript spring vuejs2 stomp spring-websocket

我试图在Vue中使用Spring websockets(STOMP),但无法弄清楚如何操作或者甚至可能。我的websockets使用普通的JS,但当我尝试使用Vue时,我会卡住。这是我的vue代码:

function FetchCtrl($scope, $http) {

  var send = function(content, contentPath, keyPath, keyValueMap) {
    //... here I copy pasted your function
  }

  $scope.send = function() {
    send(
      "some content here",
      "a content path",
      "a key path",
      "{key: value}"
    );
  }

}

})

我的连接和发送功能正在工作,我可以看到后端的消息,但问题是订阅功能。它需要一个回调函数,但这永远不会触发。我还尝试在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);
    });
},

但这也不起作用。我在https://github.com/FlySkyBear/vue-stomp找到了一些图书馆,但我无法弄清楚如何使用它,它看起来非常混乱。我宁愿使用普通的JS。

有人有解决方案吗?感谢

2 个答案:

答案 0 :(得分:15)

以下是Spring Boot Websocket(STOMP)和Vue CLI的工作示例。

  1. https://spring.io/guides/gs/messaging-stomp-websocket/
  2. 下载Spring Boot演示
  3. WebSocketConfig

    中添加允许的来源
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/gs-guide-websocket")
                .setAllowedOrigins("http://localhost:8081")
                .withSockJS();
    }
    
  4. 运行项目
  5. 现在启动Vue CLI项目并:

    1. 安装SockJS npm install sockjs-client
    2. 安装STOMP npm install webstomp-client
    3. 我使用bootstrap类,因此您需要npm install bootstrap@3仅用于布局
    4. 添加.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端口开始。

答案 1 :(得分:0)

我也处于同样的境地......

这里似乎有一个有效的解决方案:

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