You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nuxt3前端接收后端SSE的实现方案求助

在Nuxt3中实现SSE(服务器发送事件)

基础客户端实现

直接在Vue组件中使用浏览器原生EventSource即可完成SSE连接与消息监听:

<template>
  <div>
    <h3>SSE消息推送</h3>
    <ul>
      <li v-for="msg in messages" :key="msg.id">{{ msg.content }}</li>
    </ul>
  </div>
</template>

<script setup>
import { ref, onMounted, onUnmounted } from 'vue'

const messages = ref([])
let eventSource = null

onMounted(() => {
  // 连接SSE服务端端点
  eventSource = new EventSource('/api/sse')

  // 接收常规消息
  eventSource.onmessage = (event) => {
    const data = JSON.parse(event.data)
    messages.value.push({ id: Date.now(), content: data.message })
  }

  // 监听连接错误
  eventSource.onerror = (error) => {
    console.error('SSE连接异常:', error)
    eventSource.close()
  }
})

onUnmounted(() => {
  // 组件销毁时关闭连接,避免内存泄漏
  eventSource?.close()
})
</script>

封装Nuxt3插件实现复用

如果多个组件需要使用SSE,可封装为Nuxt客户端插件统一管理连接逻辑:

// plugins/sse.client.js
export default defineNuxtPlugin(() => {
  function createSSEConnection(url, onMessage, onError) {
    const eventSource = new EventSource(url)
    
    eventSource.onmessage = (event) => {
      onMessage(JSON.parse(event.data))
    }
    
    eventSource.onerror = (error) => {
      console.error('SSE连接出错:', error)
      onError?.(error)
      eventSource.close()
    }
    
    return {
      close: () => eventSource.close()
    }
  }

  return {
    provide: {
      sse: { createConnection: createSSEConnection }
    }
  }
})

在组件中调用插件:

<template>
  <div>{{ latestMessage }}</div>
</template>

<script setup>
const latestMessage = ref('')
const { $sse } = useNuxtApp()
let sseConn = null

onMounted(() => {
  sseConn = $sse.createConnection(
    '/api/sse',
    (data) => latestMessage.value = data.message,
    (error) => console.error('连接失败:', error)
  )
})

onUnmounted(() => {
  sseConn?.close()
})
</script>

Nuxt3服务端SSE端点示例

若需自行搭建SSE服务端,在Nuxt3的server目录下创建端点:

// server/api/sse.get.js
export default defineEventHandler(async (event) => {
  // 设置SSE规范响应头
  event.node.res.writeHead(200, {
    'Content-Type': 'text/event-stream',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive'
  })

  // 模拟定时推送消息
  const interval = setInterval(() => {
    event.node.res.write(`data: ${JSON.stringify({ message: `实时更新: ${new Date().toLocaleString()}` })}\n\n`)
  }, 2000)

  // 客户端断开连接时清理资源
  event.node.req.on('close', () => {
    clearInterval(interval)
    event.node.res.end()
  })

  // 阻止Nuxt自动结束响应
  return new Promise(() => {})
})

关键注意事项

  • SSE仅支持GET请求,跨域场景需服务端配置CORS允许相关请求头
  • 无需额外安装第三方模块,浏览器原生EventSource即可满足需求
  • 生产环境需确保服务端支持长连接,避免超时断开
  • 若需要双向通信,可考虑WebSocket,但SSE更适合单向推送场景

内容的提问来源于stack exchange,提问作者Faissal El OSMAN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 18:20:48