WebSocket实现数据库更新时前端页面刷新

实现WebSocket实时刷新前端页面的步骤如下:

  1. 前端客户端通过WebSocket与服务器端建立连接。

在前端,可以使用WebSocket API来建立与服务器端的连接。例如:

const ws = new WebSocket('ws://localhost:3000');
  1. 服务端通过WebSocket与数据库建立连接。

服务端需要监听客户端的WebSocket连接请求,并在成功建立连接后,再与数据库建立连接。例如:

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 3000 });

wss.on('connection', function connection(ws) {
  // 建立连接之后,与数据库建立连接,例如使用mysql的连接池
  const mysql = require('mysql');
  const pool  = mysql.createPool({
    connectionLimit : 10,
    host            : 'localhost',
    user            : 'root',
    password        : 'password',
    database        : 'database'
  });

  // 监听WebSocket消息
  ws.on('message', function incoming(message) {
    // 处理消息,例如更新数据库操作
    pool.query('UPDATE table SET column=value WHERE id = ?', [message], function (error, results, fields) {
      if (error) throw error;
      console.log('Updated ' + results.affectedRows + ' rows');
    });

    // 将更新通知所有连接的客户端
    wss.clients.forEach(function each(client) {
      if (client.readyState === WebSocket.OPEN) {
        client.send('update'); // 通知客户端刷新页面
      }
    });
  });
});
  1. 前端客户端通过WebSocket监听服务端的消息,以实现实时刷新前端页面。

客户端需要监听服务端发送的消息,并在收到消息时刷新页面。例如:

const ws = new WebSocket('ws://localhost:3000');

ws.onmessage = function(event) {
  if (event.data === 'update') {
    // 收到更新通知,刷新页面
    window.location.reload();
  }
};

示例1:

假设前端页面有一个表格,用于显示数据库中的数据,这个表格是通过AJAX从后端获取的。当数据库中的数据发生变化时,需要实时更新表格中的数据。

前端代码:

<!DOCTYPE html>
<html>
<head>
  <title>WebSocket实时更新页面示例</title>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        items: []
      },
      created: function() {
        // 通过AJAX获取数据
        this.fetchData();

        // 建立WebSocket连接
        const ws = new WebSocket('ws://localhost:3000');

        // 监听WebSocket消息
        ws.onmessage = function(event) {
          if (event.data === 'update') {
            // 收到更新通知,重新获取数据
            this.fetchData();
          }
        }.bind(this); // 注意这里bind(this)是为了让回调函数中的this指向Vue实例对象
      },
      methods: {
        fetchData: function() {
          // 发送AJAX请求
          fetch('/data')
            .then(response => response.json())
            .then(data => {
              this.items = data;
            });
        }
      }
    });
  </script>
</head>
<body>
  <div id="app">
    <table>
      <thead>
        <tr>
          <th>Name</th>
          <th>Age</th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="item in items">
          <td>{{ item.name }}</td>
          <td>{{ item.age }}</td>
        </tr>
      </tbody>
    </table>
  </div>
</body>
</html>

后端代码:

const express = require('express');
const app = express();
const http = require('http').Server(app);
const WebSocket = require('ws');
const wss = new WebSocket.Server({ server: http });

// 模拟数据库中的数据
const items = [{ name: 'Alice', age: 20 }, { name: 'Bob', age: 22 }, { name: 'Charlie', age: 25 }];

// 提供获取数据的API
app.get('/data', function(req, res) {
  res.json(items);
});

// 监听WebSocket连接
wss.on('connection', function connection(ws) {
  console.log('Client connected.');

  // 监听WebSocket消息(这里假设收到消息时需要修改数据库中的数据)
  ws.on('message', function incoming(message) {
    console.log('Received message:', message);
    // 修改数据(这里省略了更新数据库的代码)
    items.push({ name: 'David', age: 28 });
    // 将更新通知所有连接的客户端
    wss.clients.forEach(function each(client) {
      if (client.readyState === WebSocket.OPEN) {
        client.send('update'); // 通知客户端刷新页面
      }
    });
  });
});

http.listen(3000, function() {
  console.log('Server listening on http://localhost:3000');
});

示例2:

假设前端页面有一个留言板功能,当用户在留言板中发表新留言时,需要实时更新页面中的留言列表。

前端代码:

<!DOCTYPE html>
<html>
<head>
  <title>WebSocket实时更新页面示例</title>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        messages: []
      },
      created: function() {
        // 建立WebSocket连接
        const ws = new WebSocket('ws://localhost:3000');

        // 监听WebSocket消息
        ws.onmessage = function(event) {
          if (event.data === 'update') {
            // 收到更新通知,重新获取留言列表
            this.fetchMessages();
          } else {
            // 收到新留言
            const message = JSON.parse(event.data);
            this.messages.unshift(message); // 将新留言插入到列表头部
          }
        }.bind(this); // 注意这里bind(this)是为了让回调函数中的this指向Vue实例对象

        // 获取留言列表
        this.fetchMessages();
      },
      methods: {
        fetchMessages: function() {
          // 发送AJAX请求
          fetch('/messages')
            .then(response => response.json())
            .then(data => {
              this.messages = data;
            });
        },
        postMessage: function() {
          const message = { username: this.username, content: this.content };
          // 发送WebSocket消息
          const ws = new WebSocket('ws://localhost:3000');
          ws.onopen = function() {
            ws.send(JSON.stringify(message));
          };
        }
      }
    });
  </script>
</head>
<body>
  <div id="app">
    <div>
      <input v-model="username" placeholder="请输入用户名">
      <textarea v-model="content" placeholder="请输入留言内容"></textarea>
      <button @click="postMessage">发表留言</button>
    </div>
    <ul>
      <li v-for="message in messages">
        <strong>{{ message.username }}</strong>:{{ message.content }}
      </li>
    </ul>
  </div>
</body>
</html>

后端代码:

const express = require('express');
const app = express();
const http = require('http').Server(app);
const WebSocket = require('ws');
const wss = new WebSocket.Server({ server: http });

// 模拟数据库中的留言
const messages = [
  { username: 'Alice', content: 'Hello' },
  { username: 'Bob', content: 'Hi, Alice' }
];

// 提供获取留言列表的API
app.get('/messages', function(req, res) {
  res.json(messages);
});

// 监听WebSocket连接
wss.on('connection', function connection(ws) {
  console.log('Client connected.');

  // 发送留言列表
  ws.send(JSON.stringify(messages));

  // 监听WebSocket消息(这里假设收到消息时需要添加新留言到数据库中)
  ws.on('message', function incoming(message) {
    console.log('Received message:', message);
    // 添加新留言(这里省略了更新数据库的代码)
    const newMessage = { username: 'Charlie', content: message };
    messages.push(newMessage);
    // 将更新通知所有连接的客户端
    wss.clients.forEach(function each(client) {
      if (client.readyState === WebSocket.OPEN) {
        client.send(JSON.stringify(newMessage)); // 通知客户端添加新留言
        client.send('update'); // 通知客户端刷新页面
      }
    });
  });
});

http.listen(3000, function() {
  console.log('Server listening on http://localhost:3000');
});

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:WebSocket实现数据库更新时前端页面刷新 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Java日常练习题,每天进步一点点(40)

    下面是Java日常练习题的完整攻略: 1. 确定目标 我们的目标是通过做Java练习题来提高自己的编程能力,每天进步一点点。 2. 获取练习题 可以通过互联网上的Java编程练习网站,如Java编程练习网站等获取练习题。 3. 分析题目 在开始解题之前,请认真阅读题目并分析,确定题目的输入、输出、边界条件和算法思路。 4. 用Java代码实现 在分析完题目后…

    Java 2023年6月15日
    00
  • 创建Java线程安全类的七种方法

    让我详细讲解“创建Java线程安全类的七种方法”的完整攻略。Java线程安全类是多线程环境下安全并发的类,可以保证并发性的正确性。在Java中,可以使用以下7种方法来创建线程安全的类: 不可变性(Immutability):在Java中,不可变的对象是线程安全的,因为不可变对象的状态是不可更改的。你可以通过使用final修饰符来创建不可变的对象。例如: pu…

    Java 2023年5月19日
    00
  • Nginx配置的rewrite编写时last与break的区别分析

    Nginx是一种高性能的Web服务器软件,可以作为反向代理和负载均衡器等多种用途。在Nginx的配置中,rewrite指令用于重写URL路径,它支持多种标志参数,其中last和break是两个常用的参数。 概述 在对URL路径进行重写时,nginx可以使用rewrite指令,它的语法如下: rewrite regex replacement [flag]; …

    Java 2023年6月15日
    00
  • 了解java中对象基础Object类

    了解Java中对象基础Object类,需要掌握以下知识点: Object类的定义 Object类提供的常用方法 如何使用Object类 Object类的定义 在Java编程语言中,Object类是所有类的超类。如果不明确指定超类,那么所定义的类默认继承Object类。因此,Object类是Java中最基础的类之一,提供了一些非常基础的方法,并且可以被所有其他…

    Java 2023年5月26日
    00
  • Tomcat部署Bolo动态博客

    下面是详细讲解如何在Tomcat上部署Bolo动态博客的完整攻略: 准备工作 下载Bolo动态博客的源代码,可以从官方GitHub仓库或其他源中获取:https://github.com/bolo/bolo 安装Java和Tomcat,可以从官方网站下载安装包并按照提示完成安装,建议使用JDK 8版本和Tomcat 8.5版本及以上。 在Tomcat的/co…

    Java 2023年5月19日
    00
  • java追加写入txt文件的方法总结

    下面是详细讲解“Java追加写入txt文件的方法总结”的完整攻略。 1. 前言 在Java开发中,我们经常需要将程序的结果或相关数据写入到本地文件中。而在文件操作中,「追加写入」是一个非常重要的操作。相比于「覆盖写入」,追加写入可以在原有文件基础上新增内容,不会破坏已有数据。 2. 追加写入的方法 2.1. 使用FileWriter类 FileWriter类…

    Java 2023年5月19日
    00
  • JAVA中正则表达式小总结(整理)

    JAVA中正则表达式小总结(整理) 正则表达式的基本语法 正则表达式的语法分为两个部分,一个是元字符的语法,一个是限定符的语法。元字符代表一种类型的字符,在正则表达式中可以被用于匹配对应的字符,限定符用于限定匹配的次数。 元字符的语法 元字符 说明 . 匹配任意单个字符 \ 转义字符 [] 匹配中括号内的任意一个字符 [^] 匹配不在中括号内的任意一个字符 …

    Java 2023年5月27日
    00
  • SpringBoot整合Spring Data JPA的详细方法

    Spring Boot整合Spring Data JPA的详细方法 Spring Data JPA是Spring Framework的一部分,它提供了一种方便的方式来访问和操作数据库。在Spring Boot应用程序中,可以使用Spring Data JPA来简化数据库访问。本文将详细介绍Spring Boot整合Spring Data JPA的详细方法,包…

    Java 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部