如何使用微信小程序和 Server-sent Events(SSE) 构建实时聊天应用

前言

前端技术日新月异,当前最火热的前端技术当属微信小程序,而实时技术也成为了越来越多前端工程师关注的方向。本文将介绍如何使用微信小程序和 Server-sent Events(SSE) 构建实时聊天应用的具体实现方式。

SSE 简介

Server-sent Events(SSE)是一项HTML5技术,是基于 HTTP/1.1 协议的服务器推送技术。它允许服务器端向已连接的客户端实时地推送事件,而无需客户端发起请求。

SSE 的实现需要三个步骤:

  1. 客户端向服务端发起 SSE 连接请求;
  2. 服务端返回数据,并保持连接;
  3. 服务端周期性地向客户端推送数据。

微信小程序简介

微信小程序是一种不需要下载安装即可使用的应用,它的开发生态已经越来越完整。小程序可以应用于生活、娱乐、购物等方面。

微信小程序每一个页面是一个 wxml 文件,其中可以嵌入 JavaScript 代码段,用于编写逻辑。数据绑定是其中的重要特性,可以更简单地实现操作 DOM。

实现实时聊天应用

前端实现

  1. 创建页面

    在微信小程序中新建页面后,可以对应的生成对应的 wxml 和 js 文件,可以在 wxml 中设计页面布局,js 中进行交互逻辑。

  2. 发起 SSE 连接请求

    // SSE 连接
    const evtSource = new EventSource('http://localhost:8080/sse');

    在小程序中发起 SSE 连接需要使用 JavaScript 中的 EventSource 对象,接口参数为 SSE 接口地址。

  3. 接收 SSE 推送的数据

    evtSource.onmessage = e => {
      // e.data 包含 SSE 推送的数据
      const data = JSON.parse(e.data);
      console.log(data);
    
      // 聊天界面新增内容
      this.setData({
        msgList: this.data.msgList.concat(data.text)
      });
    };

    在小程序中接收 SSE 推送的数据需要监听 EventSource 对象的 onmessage 事件,每次接收到服务端推送的数据时触发该事件。

  4. 发送数据

    const data = {
      text: this.data.inputValue,
      userInfo: {
        avatarUrl: '',
        nickName: '用户1'
      }
    };
    
    wx.request({
      url: 'http://localhost:8080/api/sendMsg',
      method: 'POST',
      data,
      success: res => {
        // 发送成功后清空输入框
        this.setData({
          inputValue: ''
        });
      },
      fail() {
        wx.showToast({
          title: '发送失败,请稍后重试',
          icon: 'none'
        });
      }
    });

    在小程序中发送数据可以使用微信官方提供的 request 方法进行 post 请求。

服务端实现

服务端使用 Express.js 框架,并使用 express-sse 库实现 SSE 接口的开发。

  1. 安装 express 和 express-sse

    npm install express express-sse
  2. 定义 SSE 接口

    // 创建 SSE 接口
    app.get('/sse', (req, res) => {
      // 设置响应头,Content-Type为text/event-stream,表明这是一个SSE响应
      res.setHeader('Content-type', 'text/event-stream');
      res.setHeader('access-control-allow-origin', '*');
      res.flushHeaders();
    
      // 发送数据
      setInterval(() => {
        res.write('data: ' + JSON.stringify({ text: 'hello' }) + '\n\n');
      }, 1000);
    
      // 请求关闭时的操作
      req.on('close', () => {
        console.log('SSE connection closed.');
        res.end();
      });
    });
  3. 处理发送数据

    app.use(bodyParser.json());
    app.post('/api/sendMsg', (req, res) => {
      // 处理前端发送的数据
      console.log(req.body);
    
      // 返回成功
      res.status(200).end();
    });
    
    app.listen(8080, () => {
      console.log('app is listening on port 8080');
    });

    在服务端中处理前端的 post 请求,并处理数据,将数据发送给接收方。在本示例中仅仅返回成功。

总结

本文详细介绍了如何使用微信小程序和 Server-sent Events(SSE) 构建实时聊天应用,并提供了实现的完整示例代码以及解读。我们相信,通过本文的学习和实践,大家可以掌握前端实时数据传输的技术要点,为接下来开发更多更复杂的实时应用打下坚实的基础。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/659dec57add4f0e0ff710e1c


纠错反馈