node.js从控制器调用ws.send

iqxoj9l9  于 2023-05-17  发布在  Node.js
关注(0)|答案(1)|浏览(146)

我想发送一个WebSocket,使用express-ws从不同的控制器,而不是通过路由,我在server.js中有以下代码:

var SocketController = require('./routes/ws.routes');
var app  = express();
var server  = require('http').createServer(app);
var expressWs = require('express-ws')(app);

app.ws('/', SocketController.socketFunction);

SocketController看起来像这样:

exports.socketFunction = function (ws, req) {
    ws.on('message', function(msg) {
        console.log(msg);
        ws.send("hello");
    });
}

是否可以调用

ws.send()

来自另一个控制器的事件?如何获取ws对象?

u5rb5r59

u5rb5r591#

你将不得不把你的套接字存储在内存中。要从不同的模块访问存储的套接字,可以将这些套接字的引用存储在单独的模块中。
例如,您可以创建一个存储所有活动套接字的模块socketCollection。
socketCollection.js:

exports.socketCollection = [];

您可以在定义Web Socket服务器的位置导入此模块:

var socketCollection = require('./socketCollection');
var SocketController = require('./routes/ws.routes');
var app  = express();
var server  = require('http').createServer(app);
var expressWs = require('express-ws')(app);

expressWs.getWss().on('connection', function(ws) {
  socketCollection.push({
    id: 'someRandomSocketId',
    socket: ws,
  });
});

app.ws('/', SocketController.socketFunction);

现在每次新的客户端连接到服务器时,它的引用将保存到'socketCollection'您可以通过导入此数组从任何模块访问这些客户端

var socketCollection = require('./socketCollection');
var ws = findSocket('someRandomSocketId', socketCollection);

var findSocket = function(id, socketCollection) {
   var result  = socketCollection.filter(function(x){return x.id == id;} );
   return result ? result[0].socket : null;
};

相关问题