如何在 Sails.js v0.11 中触发自定义套接字事件?

How can I trigger custom socket events in Sails.js v0.11?

Sails.js 和套接字有问题。在大多数情况下,他们工作得很好。我能够在客户端(Sails Socket 客户端和 AngularJS)订阅套接字,并在使用蓝图更新记录时从服务器接收消息。但是,当我尝试采用更自定义的方法时,我无法触发套接字事件。我可以通过按如下方式订阅来隔离客户...

// Listen for game model event
io.socket.on('game', function(e) {
    console.log('Game Socket Event');
});

// Subscribe to model record
io.socket.get('/game/' + gameId);

同样,这对于订阅来说效果很好,但是对于一些更复杂的任务,我必须以控制器操作为目标。这些通常涉及大量记录查找,可能是对服务的调用,最后写入记录(或更多)。在链的末端,当一切都解决后,我只想向特定的客户端发出套接字消息。我想我也许可以使用类似...

Game.findOne({ id: data.gameId }).exec(function(err, gameData) {
    // Subscribe to the record
    Game.subscribe(req.socket, gameData, ['create', 'update', 'destroy']);
    // Various calls and updates to game model and others
    Game.publishUpdate(gameData.id);
}

publishUpdate() 调用中的游戏 ID 与订阅中的游戏 ID 相同,控制器操作的端点是“/game/deal”,所以我想我的问题是我是否需要再订阅一次是时候用套接字调用 URL 了吗?我正在修改游戏记录,所以我认为它无论如何都会触发一个套接字事件,但它不会。

欢迎任何指点。我使用的是 v0.10.5,但升级到 v0.11 后我遇到了同样的问题...所以我猜是我的问题。

我还应该补充一点,现在 autoWatch 和蓝图镜像选项一样设置为开。但是,我更愿意摆脱 autoWatch,只选择应该实际发出的事件。

谢谢。

如果我没看错你的问题,这个问题是你使用 HTTP 请求而不是套接字请求访问 /game/deal 端点。如果是这种情况,Game.subscribe 调用不会执行任何操作,因为服务器没有可订阅的套接字!如果您查看终端,您可能会看到 Sails 抱怨:

`Model.subscribe()` called by a non-socket request.

您问的是:

do I need to subscribe a second time to this URL with a socket call

为什么不直接通过套接字第一次点击它?

io.socket.get("/game/deal/123")

io.socket.postio.socket.put 等。控制器操作中的所有逻辑都将按预期执行,并且 req.socket 是一个真正的套接字,可以已订阅。