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

Posted

技术标签:

【中文标题】node.js 从控制器调用 ws.send【英文标题】:node.js call ws.send from controller 【发布时间】:2017-10-27 11:29:35 【问题描述】:

我想发送一个 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”对象?

谢谢!

【问题讨论】:

【参考方案1】:

您必须将套接字存储在内存中。要从不同模块访问存储的套接字,您可以将这些套接字的引用存储在单独的模块中。

例如,您可以创建一个模块 socketCollection 来存储所有活动的套接字。

socketCollection.js:

exports.socketCollection = [];

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

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;
;

【讨论】:

太好了,谢谢!如果我想发送给所有人,我会这样做:collection.forEach((data,index) => data.on('message', function(msg) data.send("hello from node") ; ); ) 每个套接字都需要一个 socket.on 吗? 不在socket上...向socket服务器注册一次事件...每次新客户端连接时都会调用...

以上是关于node.js 从控制器调用 ws.send的主要内容,如果未能解决你的问题,请参考以下文章

如何从 node.js 调用外部脚本/程序

从调用 AWS Lambda 的 Angular 工厂获取数据到控制器中

如何在 node.js 域中添加全局发射器?

当循环中调用了异步函数时,Node.JS 将如何处理循环控制?

如何从控制器渲染两种类型的数据以在 node.js 中查看?

如何从node.js控制台执行已存在的js程序? [等候接听]