0

我正在通过创建一个聊天应用程序来玩弄 Node、Socket.IO 和 BDD。在其中一项测试中,我收到一个超时错误,说明:

错误:超过 2000 毫秒的超时。确保在此测试中调用了 done() 回调。

受影响的测试是

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事件没有被服务器捕获。虽然我确实指定了它。

控制台的输出是:

发送消息!
发送!
错误:超过 2000 毫秒的超时。确保在此测试中调用了 done() 回调。

我可能做错了什么。我对Node和Socket.IO不太熟悉,所以如果这个问题很明显,我很抱歉。

我用搜索词“ socket.io server not received from client ”环顾谷歌,但从我发现的情况来看,到目前为止,没有什么能帮助我解决我的问题。

但是,我确实尝试了这个问题的解决方案,但这并没有为我解决。

我正在使用 Mocha 和 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;

}());
4

1 回答 1

1

您需要在两个方面更改代码。

首先,您需要在 socketIO 对象上监听传入的套接字连接。(见下面强调的代码)

    //.. 一些代码

    功能服务器(socketIO)
    {
        this.socketIO = socketIO;
        this.connectedUsers = {};

        this.socketIO.on('connection', (function(user)
        {
            var userID = user.client.id;

            this.connectedUsers[userID] = 用户;

            user.emit('chatterConnectionAcknowledged', { id: userID });
        }).bind(this));
    }

    //.. 一些代码

其次,当您添加新事件以在服务器上侦听时,您需要将这些事件绑定到套接字,因为它们是在从套接字客户端发出事件时将要侦听的事件。

Server.prototype.on = function (event, handler) {
  Object.keys(this.connectedUsers).map(function (key) {
    this.connectedUsers[key].on(event, handler);
  }.bind(this));
};
于 2015-06-15T15:59:06.247 回答