angularjs socket.io发出函数

时间:2014-01-27 05:18:00

标签: node.js angularjs socket.io angularjs-directive angularjs-scope

您好我正在构建一个Web应用程序,通过socket.io更新用户用户在网站上创建了多少任务。我在node.js端使用socket.emit,每次客户端创建新任务时都会向angularjs客户端发送消息。但是代码不会执行,特别是node.js文件中此块内的代码:

  console.log('a');
 io.sockets.on('connection', function(socket) {
 console.log('b');
    io.sockets.emit('send', statinfo);
});
  console.log('c');

当我查看控制台时,我看到“a”和“c”但不是“b”,因为“b”位于不执行的代码块中。

这是我的其余代码:

nodeapp.js(检索网站上的任务数量)

    app.post('/api/addtasks',function(req, res){



    /*code to add tasks above*/

            Stat.update(
                    {_id: statid},
        {$inc: {'quantity': 1}},
        function(err) {
                  console.log('test');

             Stat.find({}, function(err, docs2) {
                var statinfo = docs2;
     io.sockets.on('connection', function(socket) {
        io.sockets.emit('send', statinfo);
    });
            });

        });


    });

2 个答案:

答案 0 :(得分:1)

首先,您不希望在post请求中使用socket.io事件。首先声明连接并发出连接上发生的连接,并在内部发布时执行io.emit('event', functionName);。我在下面做了一个关于如何构造socket.io-code的例子。

截至目前,您的代码如下所示: 当API发布时,启动socket.io侦听客户端连接。这可能不是你想要的。

您是否在尝试收听socket.io事件之前启动了服务器?你的变量是如何声明的?

我刚试过这个并且它有效,所以也许可以将自己的代码与此进行比较。

服务器/ app.js

// app.js
// this is basically just the example on https://socket.io docs
'use strict';
var app = require('http').createServer(handler);
var io = require('socket.io')(app);
var fs = require('fs');

app.listen(8000);

function handler (req, res) {
  fs.readFile(__dirname + '/index.html',
  function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading index.html');
    }

    res.writeHead(200);
    res.end(data);
  });
}
// start sending once client connects
io.on('connection', function (socket) {
    console.log('Socket connected to client.');
    // emits the string 'Yay!'
    socket.emit('emitting', 'Yay!');

    // logs the data that's emitted from client when they receive 'emitting'
    socket.on('received', function (data) {
        console.log(data);
    });
});

// your api code should go here

<强>客户端/ index.html中:

<body>
    <script src="/socket.io/socket.io.js"></script>
    <script>
        // listen to your server connection
        var socket = io('localhost:8000');
        // listen for the 'emitting' event, log data, emit new event 'received' back to server
        socket.on('emitting', function (data) {
            console.log(data);
            socket.emit('received', 'thanks!');
        });
    </script>
</body>

答案 1 :(得分:0)

请记住,您需要使角度知道您在套接字处理程序中所做的更改,因为这是在角度代码之外。您可以使用$apply

执行此操作
socket.on('send', function(data) {
    scope.$apply(function(){
        //socket response gets added to scope
        $scope.taskquantity = data[0].quantity;
        console.log(data);
    });
});