EventSource 是一种在前端用于接收来自服务器的实时流式数据的API。它基于HTTP协议的Server-Sent Events(SSE)标准,允许服务器推送更新到浏览器,通常用于显示动态内容,如聊天消息、实时统计信息等场景。

基本用法

使用 EventSource 很简单,不需要复杂的配置。其主要步骤如下:

  1. 创建一个 EventSource 对象,指定服务器的 URL。
  2. 监听 message 事件以处理接收到的数据。
  3. 监听 error 事件以处理连接错误。

示例代码

// 创建一个 EventSource 实例
const eventSource = new EventSource('https://your-server.com/events');

// 监听消息事件
eventSource.onmessage = function(event) {
    console.log('Received message:', event.data);
};

// 监听错误事件
eventSource.onerror = function(event) {
    console.error('EventSource failed:', event);
};

传递参数

通常,向服务器传递参数可以通过在 URL 中拼接查询字符串来实现。例如,如果我们要发送一个用户ID,可以这样做:

const userId = 123;
const eventSource = new EventSource(`https://your-server.com/events?userId=${userId}`);

配置请求头

EventSource API 本身并不支持直接设置请求头。这是因为它使用的是浏览器的 XMLHttpRequest 技术,而 XMLHttpRequest 不支持自定义的请求头。通常,如果需要在服务端进行鉴权,可以考虑以下几种解决方案:

  1. Token 作为查询参数:在 EventSource 的 URL 中直接传递认证信息。
  2. 使用 Cookie:如果用户已登录,服务器可以通过 cookie 识别用户。大部分情况下,登录后会自动将 token 存储在 cookie 中,服务器可以直接读取。

示例代码(传递 Token)

以下是如何将 Token 作为查询参数传递的示例:

const token = 'YOUR_AUTH_TOKEN';
const eventSource = new EventSource(`https://your-server.com/events?token=${token}`);

处理服务器端

在服务器端,我们需要确保能够处理来自 EventSource 的请求。以下是一个简单的 Node.js 服务器示例,使用 Express 框架:

const express = require('express');
const cors = require('cors');

const app = express();
app.use(cors());

app.get('/events', (req, res) => {
    res.setHeader('Content-Type', 'text/event-stream');
    res.setHeader('Cache-Control', 'no-cache');
    res.setHeader('Connection', 'keep-alive');

    const userId = req.query.userId;

    // 这里可以根据 userId 进行相应的处理
    console.log(`User ID: ${userId}`);

    // 示例:每隔1秒发送一条消息
    const intervalId = setInterval(() => {
        const message = `Hello User ${userId}, time is ${new Date().toLocaleTimeString()}`;
        res.write(`data: ${message}\n\n`);
    }, 1000);

    // 监听客户端断开连接
    req.on('close', () => {
        clearInterval(intervalId);
        res.end();
    });
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
    console.log(`Server running on port ${PORT}`);
});

总结

EventSource 是一种简单有效的方式,可以在前端应用中实现实时数据流。然而,配置请求头的支持有限,但可以通过其他方式(如 Token 作为查询参数)进行身份验证。结合这种方法,开发者能够为用户提供更加即时和动态的用户体验。在实现过程中,要特别注意连接管理和错误处理,确保在网络不稳定的环境中也能提供良好的用户体验。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部