PM2+Express+Mongoose 实现 WebSocket 应用示例

本文介绍了如何使用 PM2、Express、Mongoose 等工具实现一个 WebSocket 应用,让你能够更好地应对实时通信的场景。

为什么使用 WebSocket?

WebSocket 是一种新型的网络通信协议,它采用了 WebSocket 协议和 WebSockets API,可以在客户端和服务器之间建立实时的双向通信。与传统的 HTTP 请求-响应模式相比,WebSocket 允许服务器主动向客户端推送数据,降低了延迟和带宽的消耗,并提高了用户体验。

在实际的应用场景中,WebSocket 适用于实时通信、多人游戏、在线聊天、实时交易、股票行情、视频直播等需要高实时性、高并发性的场景。

技术方案概述

  • 后端框架:Express
  • 数据库:Mongoose
  • 进程管理:PM2
  • 前端框架:Vue.js
  • 实时通信协议:WebSocket

服务端代码实现

在服务端实现 WebSocket 功能需要借助于 socket.io 开源库,通过 Express 中间件来实现。

安装和初始化项目

首先创建一个新项目并安装 Express 和 Mongoose 等必要的依赖。

mkdir websocket-demo
cd websocket-demo
npm init -y
npm install express mongoose socket.io --save

然后在项目根目录下创建 app.js 文件,并引入必要的模块。

const express = require('express');
const http = require('http');
const mongoose = require('mongoose');
const socketIO = require('socket.io');

要想使用 Socket.io 进行 WebSocket 通信,需要创建一个 HTTP 服务器,并将其传递给 Socket.io。

const app = express();
const server = http.createServer(app);
const io = socketIO(server);

连接 MongoDB

app.js 中,连接 MongoDB 可以使用 Mongoose 进行操作。可以在 app.js 中添加以下代码:

mongoose.connect('mongodb://localhost/websocket_demo', {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useCreateIndex: true
}).then(() => {
    console.log('Connected to MongoDB');
}).catch((err) => {
    console.log('Error:', err.message);
});

实现 WebSocket

现在已经创建了一个 HTTP 服务器,并引入了 Socket.io,下一步就是在 Express 中间件上应用 Socket.io。

io.on('connection', (socket) => {
  console.log('Client connected');

  socket.on('event', (data) => {
    console.log(data);
  });

  socket.on('disconnect', () => {
    console.log('Client disconnected');
  });
});

app.use((req, res, next) => {
    req.io = io;
    next();
});

app.use('/api/test', require('./routes/test'));

这里使用了 io.on() 方法监听客户端连接事件。在连接成功后就可以注册事件监听了。这里用 socket.on() 监听客户端发送过来的 event 事件。在 socket.on() 内部,可以做任何想做的操作,例如向所有客户端广播信息、更新数据库等等。在客户端断开连接时,可以使用 socket.on('disconnect') 事件进行监听。

同时,在 app.js 中使用 Express 的路由中间件来处理客户端的 HTTP 请求。这里只提供了一个测试用例。

app.use('/api/test', require('./routes/test'));

启动服务

app.js 中,增加以下代码在本地环境中启动应用。

const port = process.env.PORT || 3000;

server.listen(port, () => {
  console.log(`Server started on port ${port}`);
});

可以使用 npm start 命令启动应用。但这里推荐使用 PM2 来实现进程管理,可以提高项目的稳定性和可用性。

PM2 进程管理

在 Node.js 项目中,使用 PM2 可以实现进程管理,包括常驻服务、自动拉起、进程监控等功能,这样可以保证服务稳定运行,并且可以在服务器的 CPU、内存等系统资源受限时自动处理请求。

使用默认的 pm2 命令启动应用。

pm2 start app.js

或者,使用 pm2-api 启动应用。

npm install pm2-api -g

pm2 start app.js -i max

pm2 list

使用 pm2-api,可以通过 HTTP 接口实现进程管理,例如:

curl http://localhost:9615/status

现在,服务器已经可以成功地监听 WebSocket 事件,并与客户端进行实时通信。

服务端完整示例代码:https://github.com/xindoo/websocket-demo

客户端代码实现

使用 npm install socket.io-client 命令安装 Socket.io 客户端。

import io from 'socket.io-client';

var socket = io('http://localhost:3000');
socket.on('connect', function () {
    console.log('Connected!');
}).on('event', function (data) {
    console.log(data);
}).on('disconnect', function () {
    console.log('Disconnected!');
});

在客户端中使用 io() 方法连接服务器,监听 connecteventdisconnect 事件,分别表示连接成功、接收到服务器传输的数据和断开连接。

客户端完整示例代码:https://github.com/xindoo/websocket-client-demo

总结

本文介绍了如何使用 PM2、Express、Mongoose 等工具实现一个 WebSocket 应用。Socket.io 提供了强大、灵活的实时通信功能。使用 PM2 可以实现进程管理,保证服务稳定运行。通过本文,你可以掌握 WebSocket 的基本知识,了解如何在 Express 中使用 Socket.io 实现 WebSocket 功能。

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


纠错反馈