WebSocket是在TCP/IP协议之上的一个Socket协议,由于http/https只能有客户端发起请求到服务端,服务端无法主动发起请求到客户端,为了解决服务器向浏览器主动推送的场景。本文讲述一下在express-ws 在 NodeJs 中如何结合 express 引入 webSocket
1.基本使用
(1)安装Express-ws:
npm i express-ws
(2)引入到index.js中并创建服务:
var express = require('express');
var expressWs = require('express-ws');
var app = express();
(3)引入expressWs方法,app对象作为参数传入
expressWs(app);
(4)通过执行以上的方法,会在现有的 app 实例上绑定 websocket 协议的封装方法,在调用该方法时,语法类似 express 提供的 get、post、put 等方法:
app.ws('/socketTest', (ws, req)=>{
// 返回给客户端
ws.send('连接成功')
// 监听 message 事件,拿到客户端通过 websocket 发送过来的数据
ws.on('message', (msg)=> {
// 业务代码
})
})
回调函数中,有两个参数:
- ws:websocket 实例 该实例可以监听来自客户端的消息发送事件(message 事件)。
- req:浏览器请求(request)实例,我们可以通过解析这个对象拿到相应的参数。
ws 实例提供了 send 方法,用于向浏览器 socket 发送数据。
通过监听 message 事件,我们可以拿到浏览器通过 websocket 为我们发送的数据。
2.模块化开发
一般在大型应用中,我们不会将所有的代码都写在一个文件中,express 为我们提供了模块化路由。在模块化路由中,express 允许我们创建一个迷你 app 实例,最后将其挂载于我们的主模块实例上即可。
如果我们想单独在 module1 模块上实现 websocket,需要分别在主模块的 app 以及 module1 模块的子路由中分别进行绑定,才可以在 module1 中使用 ws 方法:
// module1.js
var express = require('express');
var expressWs = require('express-ws');
var router = express.Router();
expressWs(router);
router
.ws('/user', function (ws, req){
ws.on('message', function (msg) {
// 业务代码
...
})
})
.get('/user', function(req, resp) {
})
.post('/user', function(req, resp) {
})
...
module.exports = router;
// app.js
var express = require('express');
var expressWs = require('express-ws');
var module1 = require('module1');
var app = express();
expressWs(app);
app.use('/ifc', module1);
app.listen(8080);
3.结合 http 模块使用
将 httpsServer 作为 express-ws 的第二个参数使用,使用于 http 和 https
var httpsServer = https.createServer(credentials, app);
httpsServer.listen(8443);
var expressWss = require('express-ws')(app, httpsServer);