【问题标题】:socket.io emit not working properly inside express routesocket.io 在快速路由中发出无法正常工作
【发布时间】:2018-05-25 18:29:26
【问题描述】:

我在 Node.js 中使用 soket.io,它工作正常,但是路由文件中存在问题。

以下是我的代码和流程。 我有server.js 文件,我在其中定义io

var express = require('express'),
    app = express(),
    http = require('http').Server(app);
var io = require('socket.io').listen(http);


//io from server.js
io.on('connection', function (socket) {

  socket.emit('getDevicePostData', { message : 'Hi from server!!' });
  socket.on('sendDevicePostData', function("Hi from server") {});
});


// pass io to routes file
var smart_control = require('./smart_control.js')(io);
app.use('/', smart_control);

smart_control.js 文件代码如下

module.exports = function(io) {

    router.post('/emitdata', function(req, res, next) {
        io.sockets.emit('getDevicePostData', { message : 'Hi from route!!' });
    });
return router;
}

上述路由的发射有时有效,有时无效。

这个发射是从 Angular js 调用的。我在角度使用https://www.npmjs.com/package/angular-socket-io 包 角度控制器中的以下代码:

mySocket.on('getDevicePostData', function(data) {

                    console.log(data);
                 });

这里 mySocket 是工厂。

我的代码有什么问题。主要是路由文件的问题。

【问题讨论】:

  • 当它不起作用时会发生什么?服务器是否显示与 POST 相关的任何内容?比如:POST /emitdata [响应码]
  • 当我调用路由时,我在 mySocket.on('getDevicePostData', function(data) { console.log(data); }); 的角度侧没有得到任何响应;
  • 你的路由器被调用了吗?
  • 我已经在我的演示中实现了你的代码,我发现发布请求没有完成。所以你需要手动 end 使用这个请求:res.end();。最后在 router.post 请求中添加这个。
  • 我使用 res.json({data:"success"});在路由器帖子的末尾

标签: angularjs node.js express socket.io


【解决方案1】:

您只需将io.sockets.emit 替换为io.emit

这里io.sockets.emit 将只发送给连接的客户端,并且在您点击 API 时您的套接字工厂可能还没有启动。

【讨论】:

  • 我尝试 io.emit 但同样的问题。有时正常发射,有时不发射
猜你喜欢
  • 2023-02-09
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
  • 2016-11-26
  • 2014-12-05
  • 2018-01-17
  • 2017-10-15
相关资源
最近更新 更多