Sse.vue 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. <script setup>
  2. import { fetchEventSource } from '@microsoft/fetch-event-source';
  3. import { ref } from 'vue';
  4. const message = ref('');
  5. const result = ref('');
  6. /**
  7. * Establishes a server-sent event stream to receive real-time messages from the server.
  8. *
  9. * @param {object} [params={}] - The parameters to be sent to the server.
  10. *
  11. * @returns {void}
  12. */
  13. const getRealtimeMessage = ()=>{
  14. const params = {
  15. message: message.value
  16. };
  17. const ctrlAbout = new AbortController();
  18. fetchEventSource('/api/events', {
  19. method: 'POST',
  20. headers: {
  21. 'Authorization': 'token',
  22. 'Content-Type': 'application/json', // 文本返回格式
  23. },
  24. body: JSON.stringify(params),
  25. signal: ctrlAbout.signal,
  26. openWhenHidden: true, // 在浏览器标签页隐藏时保持与服务器的EventSource连接
  27. onmessage(res) {
  28. // 操作流式数据
  29. result.value += res.data + '\n';
  30. },
  31. onclose(res) {
  32. // 关闭流
  33. },
  34. onerror(error) {
  35. // 返回流报错
  36. }
  37. })
  38. }
  39. </script>
  40. <template>
  41. <div>
  42. <van-field v-model="message" placeholder="请输入" type="textarea" />
  43. <van-button type="primary" @click="getRealtimeMessage">发送</van-button>
  44. <van-field v-model="result" type="textarea" />
  45. </div>
  46. </template>
  47. <style scoped>
  48. </style>