Socket.IO 服务器未收到来自客户端的消息
Socket.IO server not receiving message from client
我正在通过创建聊天应用程序来使用 Node、Socket.IO 和 BDD。在其中一项测试中,我收到超时错误:
Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test.
受影响的测试是
it('#must be able to receive a message', function(done)
{
chatterServer.on('chatterMessage', function(data)
{
console.log('Incoming message!');
expect(data).to.have.property('message');
expect(data.message).to.be('Hello, world!');
done();
});
console.log('Sending message!');
chatterClient.send('chatterMessage', { message: 'Hello, world!' });
console.log('Sent!');
});
我发现这个问题的原因是 chatterMessage
事件没有被服务器捕获。虽然我确实指定了它。
控制台的输出是:
Sending message!
Sent!
Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test.
我可能做错了什么。我对 Node 和 Socket.IO 不太熟悉,如果这个问题很明显,我很抱歉。
我用搜索词“socket.io server not received from client”环顾了 Google,但据我发现,没有任何帮助到目前为止解决我的问题。
不过,我确实尝试了 this question 中的解决方案,但这并没有为我解决问题。
我正在使用摩卡和 expect.js
完整的测试是:
var util = require('util');
var Chatter = require('../src/index');
var ChatterServer = Chatter.Server;
var ChatterClient = Chatter.Client;
var express = require('express');
var expect = require('expect.js');
var socketIO = require('socket.io');
var socketIOClient = require('socket.io-client');
var host = 'http://localhost';
var port = 8080;
describe('Chatter', function()
{
'use strict';
var chatterServer;
var chatterClient;
var server;
before(function()
{
var app = express();
server = app.listen(port);
});
beforeEach(function()
{
chatterServer = new ChatterServer(socketIO(server));
chatterClient = new ChatterClient(socketIOClient, util.format('%s:%s', host, port.toString()));
});
...
it('#must be able to receive a message', function(done)
{
chatterServer.on('chatterMessage', function(data)
{
console.log('Incoming message!');
expect(data).to.have.property('message');
expect(data.message).to.be('Hello, world!');
done();
});
console.log('Sending message!');
chatterClient.send('chatterMessage', { message: 'Hello, world!' });
console.log('Sent!');
});
});
我的客户 (ChatterClient) 是:
(function()
{
'use strict';
function Client(socketIO, url)
{
this.socketIO = socketIO(url);
}
Client.prototype.send = function(event, data)
{
this.socketIO.emit(event, data);
};
Client.prototype.on = function(event, callback)
{
this.socketIO.on(event, callback);
};
if (module !== undefined && module.hasOwnProperty('exports')) {
module.exports = Client;
} else {
window.Chatter = {
Client: Client,
};
}
}());
服务器 (ChatterServer) 是:
(function()
{
'use strict';
function Server(socketIO)
{
this.socketIO = socketIO;
this.connectedUsers = {};
this.on('connection', (function(user)
{
var userID = user.client.id;
this.connectedUsers[userID] = user;
user.emit('chatterConnectionAcknowledged', { id: userID });
}).bind(this));
}
Server.prototype.on = function(event, handler)
{
this.socketIO.on(event, handler);
};
module.exports = Server;
}());
您需要在两个方面更改您的代码。
第一方,您需要在 socketIO 对象上监听传入的套接字连接。 (见下面强调的代码)
//.. some code
function Server(socketIO)
{
this.socketIO = socketIO;
this.connectedUsers = {};
this.socketIO.on('connection', (function(user)
{
var userID = user.client.id;
this.connectedUsers[userID] = user;
user.emit('chatterConnectionAcknowledged', { id: userID });
}).bind(this));
}
//.. some code
第二方,当您添加新事件以在服务器上侦听时,您需要将这些事件绑定到套接字,因为它们将在事件发生时侦听从套接字客户端发出。
Server.prototype.on = function (event, handler) {
Object.keys(this.connectedUsers).map(function (key) {
this.connectedUsers[key].on(event, handler);
}.bind(this));
};
我正在通过创建聊天应用程序来使用 Node、Socket.IO 和 BDD。在其中一项测试中,我收到超时错误:
Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test.
受影响的测试是
it('#must be able to receive a message', function(done)
{
chatterServer.on('chatterMessage', function(data)
{
console.log('Incoming message!');
expect(data).to.have.property('message');
expect(data.message).to.be('Hello, world!');
done();
});
console.log('Sending message!');
chatterClient.send('chatterMessage', { message: 'Hello, world!' });
console.log('Sent!');
});
我发现这个问题的原因是 chatterMessage
事件没有被服务器捕获。虽然我确实指定了它。
控制台的输出是:
Sending message!
Sent!
Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test.
我可能做错了什么。我对 Node 和 Socket.IO 不太熟悉,如果这个问题很明显,我很抱歉。
我用搜索词“socket.io server not received from client”环顾了 Google,但据我发现,没有任何帮助到目前为止解决我的问题。
不过,我确实尝试了 this question 中的解决方案,但这并没有为我解决问题。
我正在使用摩卡和 expect.js
完整的测试是:
var util = require('util');
var Chatter = require('../src/index');
var ChatterServer = Chatter.Server;
var ChatterClient = Chatter.Client;
var express = require('express');
var expect = require('expect.js');
var socketIO = require('socket.io');
var socketIOClient = require('socket.io-client');
var host = 'http://localhost';
var port = 8080;
describe('Chatter', function()
{
'use strict';
var chatterServer;
var chatterClient;
var server;
before(function()
{
var app = express();
server = app.listen(port);
});
beforeEach(function()
{
chatterServer = new ChatterServer(socketIO(server));
chatterClient = new ChatterClient(socketIOClient, util.format('%s:%s', host, port.toString()));
});
...
it('#must be able to receive a message', function(done)
{
chatterServer.on('chatterMessage', function(data)
{
console.log('Incoming message!');
expect(data).to.have.property('message');
expect(data.message).to.be('Hello, world!');
done();
});
console.log('Sending message!');
chatterClient.send('chatterMessage', { message: 'Hello, world!' });
console.log('Sent!');
});
});
我的客户 (ChatterClient) 是:
(function()
{
'use strict';
function Client(socketIO, url)
{
this.socketIO = socketIO(url);
}
Client.prototype.send = function(event, data)
{
this.socketIO.emit(event, data);
};
Client.prototype.on = function(event, callback)
{
this.socketIO.on(event, callback);
};
if (module !== undefined && module.hasOwnProperty('exports')) {
module.exports = Client;
} else {
window.Chatter = {
Client: Client,
};
}
}());
服务器 (ChatterServer) 是:
(function()
{
'use strict';
function Server(socketIO)
{
this.socketIO = socketIO;
this.connectedUsers = {};
this.on('connection', (function(user)
{
var userID = user.client.id;
this.connectedUsers[userID] = user;
user.emit('chatterConnectionAcknowledged', { id: userID });
}).bind(this));
}
Server.prototype.on = function(event, handler)
{
this.socketIO.on(event, handler);
};
module.exports = Server;
}());
您需要在两个方面更改您的代码。
第一方,您需要在 socketIO 对象上监听传入的套接字连接。 (见下面强调的代码)
//.. some code function Server(socketIO) { this.socketIO = socketIO; this.connectedUsers = {}; this.socketIO.on('connection', (function(user) { var userID = user.client.id; this.connectedUsers[userID] = user; user.emit('chatterConnectionAcknowledged', { id: userID }); }).bind(this)); } //.. some code
第二方,当您添加新事件以在服务器上侦听时,您需要将这些事件绑定到套接字,因为它们将在事件发生时侦听从套接字客户端发出。
Server.prototype.on = function (event, handler) {
Object.keys(this.connectedUsers).map(function (key) {
this.connectedUsers[key].on(event, handler);
}.bind(this));
};