您好我正在构建一个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);
});
});
});
});
答案 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);
});
});