重生之我在NestJS中使用EventStream

有一个需求是需要长连接等待后台的返回,我们使用的EventStream,在NestJS中使用很简单,框架基本上已经封装好了

0. 如果没有创建项目的,可以先创建一个项目,创建项目的直接跳转到下一个步骤去

  • 全局安装 nest: npm install @nestjs/cli global
  • 创建项目: nest new nest-demo-app

1. 在NestJS中的代码

app.constroller.ts 中新建一个方法,如下:

import { Observable } from 'rxjs';
import { Controller, Sse } from '@nestjs/common';

@Controller()
class AppController {

  @Sse('test/event-stream') // 这个是访问的链接地址 http://localhost:3000/test/event-stream
  testEventStream() {
    let count = 0;
    return new Observable(observer => {
      // 调用 observer.next() 这个方法向前端推送消息
      setInterval(() => {
        count++;
        observer.next({ data: new Date().toLocalTimeString() });
      }, 3000);

      // 调用 observer.complete() 这个方法,表示结束本次推送
      if (count > 5) {
        observer.complete();
        // 或者调用 observer.unsubscribe() 也可以结束推送
      }
    });
  }
}

2. 在前端调用这个接口

const stream = new EventSource('http://localhost:3000/test/event-stream')
let count = 0
stream.onopen = () => {
  console.log('连接打开');
}
stream.onmessage = e => {
  console.log(e.data); // 打印获取到的数据,也就是 NestJS 中 observer.next() 中发送的数据
  if (count++ >= 5) {
    stream.close(); // 主动关闭连接
  }
}
stream.onerror = e => {
  console.error(e); // 打印错误日志
}
stream.onclose = () => {
  console.log('连接关闭'); // 关闭连接 
}

注意:

  1. 前端在一个长连接完成之后,如果没有主动关闭连接,会一直发这个连接,所以在 message 中需要根据条件判断一下,主动关闭连接
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
NestJS是一个用于构建高效、可扩展的Node.js服务器端应用程序的开发框架。它提供了一组强大的工具和模块,使得开发者可以快速构建可维护、可测试的应用程序。 在NestJS使用SSE(Server-Sent Events)来实现服务器向客户端推送事件。SSE是一种基于HTTP的轻量级协议,允许服务器向客户端推送事件,而无需客户端发送请求。 在NestJS使用SSE非常简单,只需要在控制器返回一个EventSource对象即可,如下所示: ``` import { Controller, Get } from '@nestjs/common'; @Controller() export class AppController { @Get('events') events(): any { const eventSource = new EventSource('/stream'); return { eventSource }; } } ``` 上面的代码创建了一个/events路由,当客户端访问该路由时,将返回一个包含EventSource对象的响应。客户端可以使用EventSource对象来监听服务器推送的事件。 接下来,我们需要创建一个/stream路由,用于向客户端推送事件。可以使用NestJS提供的@EventPattern装饰器来实现该功能,如下所示: ``` import { Controller, Get } from '@nestjs/common'; import { EventPattern } from '@nestjs/microservices'; @Controller() export class AppController { @Get('events') events(): any { const eventSource = new EventSource('/stream'); return { eventSource }; } @EventPattern('newMessage') async handleNewMessage(data: any) { const message = JSON.stringify(data); const event = `data: ${message}\n\n`; eventSource.write(event); } } ``` 上面的代码,@EventPattern('newMessage')装饰器表示该方法会处理名为newMessage的事件。在handleNewMessage方法,我们将接收到的数据转换为字符串,并通过eventSource对象向客户端推送事件。 相关问题: 1. SSE和WebSocket有什么区别? 2. 在NestJS如何处理WebSocket连接? 3. 如何在NestJS处理异步事件?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潇洒哥GG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值