首页 > 系统相关 >Server-Sent Events (SSE) Koa2 & Nginx & React 实践

Server-Sent Events (SSE) Koa2 & Nginx & React 实践

时间:2024-09-25 14:13:27浏览次数:7  
标签:axios const Server React Nginx proxy SSE

Server-Sent Events (SSE) Koa2 & Nginx & React 实践

得鹿梦鱼 得鹿梦鱼 前端+node全栈,骑马找马中,有兴趣可私聊  

在现代 Web 应用中,实时数据传输变得越来越重要。Server-Sent Events (SSE) 是一种轻量级的技术,允许服务器向客户端主动发送更新。本文将详细介绍如何在 Koa2 框架下实现 SSE,并配置 Nginx 以支持 HTTP 和 HTTPS 协议。同时,我们还将展示如何在 React 前端使用 axios 来接收这些事件。

什么是 Server-Sent Events?

Server-Sent Events (SSE) 是一种基于 HTTP 的实时数据传输技术。与 WebSocket 不同,SSE 仅支持单向通信,即服务器到客户端。这使得 SSE 在某些场景下更为简单和高效,特别是当只需要从服务器推送数据到客户端时。

在 Koa2 中实现 SSE

首先,我们需要创建一个 Koa2 应用,并设置一个路由来处理 SSE 连接。

1. 创建 Koa2 应用

安装必要的依赖:

npm init -y
npm install koa koa-router

创建 app.js 文件,并设置基本的 Koa2 应用结构:

const Koa = require('koa');
const Router = require('koa-router');

const app = new Koa();
const router = new Router();

// SSE 路由处理
router.get('/events', async (ctx, next) => {
    // SSE 相关逻辑将在这里实现
});

app.use(router.routes()).use(router.allowedMethods());

app.listen(3000, () => {
    console.log('Server is running on http://localhost:3000');
});

2. 实现 SSE 逻辑

在 /events 路由中,我们需要设置响应头以支持 SSE,并发送实时数据:

router.get('/events', async (ctx, next) => {
    // 设置响应头
    ctx.set({
        'Content-Type': 'text/event-stream',
        'Cache-Control': 'no-cache',
        'Connection': 'keep-alive'
    });

    // 发送数据
    const sendEvent = (data) => {
        ctx.res.write(`data: ${JSON.stringify(data)}\n\n`);
    };

    // 模拟实时数据发送
    const interval = setInterval(() => {
        const message = { time: new Date().toLocaleTimeString() };
        sendEvent(message);
    }, 1000);

    // 当客户端关闭连接时清除定时器
    ctx.req.on('close', () => {
        clearInterval(interval);
    });
});

配置 Nginx 以支持 SSE

为了使 SSE 同时支持 HTTP 和 HTTPS,我们需要在 Nginx 中进行相应的配置。

假设你已经安装了 Nginx,并且有一个域名 example.com 指向你的服务器。

1. 修改 Nginx 配置文件

编辑你的 Nginx 配置文件(通常位于 /etc/nginx/sites-available/example.com),添加以下内容:

server {
    listen 80;
    listen [::]:80;
    server_name example.com;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Connection '';
        proxy_buffering off;
    }
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name example.com;

    # SSL 证书配置(省略)

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Connection '';
        proxy_buffering off;
    }
}

这里的关键是设置 proxy_http_version 为 1.1,并将 Connection 头设置为空字符串,以及关闭 proxy_buffering

2. 重启 Nginx

sudo systemctl restart nginx

在 React 前端使用 axios 接收 SSE

现在我们来创建一个简单的 React 应用来接收服务器发送的事件。

1. 创建 React 应用

使用 create-react-app 创建一个新的 React 应用:

npx create-react-app sse-client
cd sse-client
npm start

2. 使用 axios 接收事件

安装 axios:

npm install axios

修改 src/App.js,使用 axios 接收 SSE:

import React, { useState, useEffect } from 'react';
import axios from 'axios';

function App() {
    const [events, setEvents] = useState([]);

    useEffect(() => {
        const eventSource = axios.get('http://example.com/events', {
            responseType: 'stream'
        });

        eventSource.then(response => {
            response.data.on('data', (event) => {
                const parsedEvent = JSON.parse(event.data);
                setEvents((prevEvents) => [...prevEvents, parsedEvent]);
            });
        });

        return () => {
            eventSource.cancel();
        };
    }, []);

    return (
        <div className="App">
            <h1>Server-Sent Events</h1>
            <ul>
                {events.map((event, index) => (
                    <li key={index}>{event.time}</li>
                ))}
            </ul>
        </div>
    );
}

export default App;

总结

通过本文,我们学习了如何在 Koa2 应用中实现 Server-Sent Events,配置 Nginx 以支持 HTTP 和 HTTPS 协议,并在 React 前端使用 axios 接收这些事件。SSE 提供了一种轻量级的方法来实现服务器到客户端的实时数据传输,适用于许多实时应用场景。希望本文能帮助你更好地理解和使用 SSE。

编辑于 2024-02-20 11:04・IP 属地浙江

标签:axios,const,Server,React,Nginx,proxy,SSE
From: https://www.cnblogs.com/sexintercourse/p/18431246

相关文章

  • Nginx 如何防止 DDoS 攻击
     Nginx如何防止DDoS攻击原创广智架构经纬 2024年09月21日12:00上海听全文【每天5分钟,了解一个知识点】 DDoS(分布式拒绝服务攻击)是一个让很多网站和服务头疼的问题。DDoS攻击就像是一群不怀好意的人一起堵塞了你的店门,让正常的顾客无法进入。那我们该如何利用Ngi......
  • SQL Server 语句日期格式查找方法
    SQLServer语句日期格式查找方法 1.SQLServer中,处理日期格式和查找特定日期格式方法示例在SQLServer中,处理日期格式和查找特定日期格式的记录是一个常见的需求。SQLServer提供了多种函数和格式选项来处理和比较日期。以下是一个详细的示例,展示了如何根据特定日期格式查......
  • linux集群 keepalived+nginx实现高可用集群
    用keepalived配置高可用搭建高可用集群高可用集群,即“HA集群”,也常称作“双机热备”,用于关键业务。常见实现高可用的开源软件有heartbeat和keepalived,其中keepalived还有负载均衡的功能。这两个软件类似,核心原理都是通过心跳线连接两台服务器,正常情况下由一台服务器提供服务,......
  • 单个48TB大小SQL Server数据库备份导致日志文件无法截断
    单个48TB大小SQLServer数据库备份导致日志文件无法截断 SQLServer版本:SQLServer2019背景在一个48T大小的单数据库环境中,采用简单恢复模式,日志文件大小限制为600G。执行一次完整备份时,耗时超过12小时,导致日志文件无法截断并达到上限,后续事务无法正常写入,导致整个数据库不可......
  • (零) React Native 项目开发拾遗
    (零)ReactNative项目开发拾遗 一位离职的前端同事,最近接了个 ReactNative 的活儿,遇到许多搞不定的问题,于是找到我帮忙“补课”(没有系统的学习 ReactNative,也不具备原生 Android 和 iOS 开发基础知识)。此前带过另一位前端同事入门 ReactNative 开发,有段时间甚......
  • SQL Server的Descending Indexes降序索引
    SQLServer的DescendingIndexes降序索引 SQLServer的DescendingIndexes降序索引   背景索引是关系型数据库中优化查询性能的重要手段之一。对于需要处理大量数据的场景,合理的索引策略能够显著减少查询时间。特别是在涉及多字段排序的复杂查询中,选择合适的索引类型......
  • Server-Sent Events 教程
    Server-SentEvents教程作者: 阮一峰日期: 2017年5月27日服务器向浏览器推送信息,除了 WebSocket,还有一种方法:Server-SentEvents(以下简称SSE)。本文介绍它的用法。一、SSE的本质严格地说,HTTP协议无法做到服务器主动推送信息。但是,有一种变通方法,就是服务器向客户端声......
  • Nginx 在处理大规模分布式系统时有哪些性能优化技巧?
    在处理大规模分布式系统时,Nginx可以通过多种方式进行性能优化。以下是一些有效的性能优化技巧:优化Worker进程与连接数:根据服务器的CPU核数设置worker_processes参数,通常设置为自动检测或等于CPU核心数。调整worker_connections参数,以确定每个worker进程能处理的最大连......
  • 四款负载均衡工具Nginx、HAProxy、MetalLB、gobetween 比较
    以下是对Nginx、HAProxy、MetalLB和gobetween四个开源负载均衡工具的详细对比与分析:Nginx:优点:工作在网络的7层之上,可以针对HTTP应用做一些分流策略,如基于域名、目录结构分流。对网络稳定性依赖小,理论上能ping通就能进行负载均衡。安装和配置简单,有清晰的日志用于排查和管理。支持......
  • 远程办公、企业内网服务器的Code-Server上如何配置使用CodeGeeX插件
    很多小伙伴都会在工作中使用code-server,比如说远程办公,当你需要在家访问你的工作环境,亦或者是你们公司的Docker是放入服务器中。code-server无疑是最好的选择,它可以让你通过互联网安全地连接到远程服务器上的开发环境并且使用VSCode。这也符合code-server的初衷——能够在任何机......