Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 诺德尼执行令?_Node.js_Nodeunit - Fatal编程技术网

Node.js 诺德尼执行令?

Node.js 诺德尼执行令?,node.js,nodeunit,Node.js,Nodeunit,我正在尝试使用nodeunit测试我的web服务器: test.js exports.basic = testCase({ setUp: function (callback) { this.ws = new WrappedServer(); this.ws.run(PORT); callback(); }, tearDown: function (callback) { delete this.ws; callback(); },

我正在尝试使用nodeunit测试我的web服务器:

test.js

exports.basic = testCase({

  setUp: function (callback) {
    this.ws = new WrappedServer();
    this.ws.run(PORT);
    callback();
  },

  tearDown: function (callback) {
    delete this.ws;
    callback();
  },

  testFoo: function(test) { 
    var socket = ioClient.connect(URL);
    console.log('before client emit')
    socket.emit('INIT', 1, 1);
    console.log('after client emit');
  }
});
这是我非常简单的nodejs服务器:

WrappedServer.prototype.run = function(port) { 
  this.server = io.listen(port, {'log level': 2});
  this.attachCallbacks();
};

WrappedServer.prototype.attachCallbacks = function() { 
  var ws = this;    
  ws.server.sockets.on('connection', function(socket) { 
    ws.attachDebugToSocket(socket);

    console.log('socket attaching INIT');
    socket.on('INIT', function(userId, roomId) {
      // do something here
    });
    console.log('socket finished attaching INIT');
  });
}
基本上我得到了这个错误:

[...cts/lolol/nodejs/testing](testingServer)$ nodeunit ws.js 
   info  - socket.io started
before client emit
after client emit
   info  - handshake authorized 1013616781193777373
The "sys" module is now called "util". It should have a similar interface.
socket before attaching INIT
socket finished attaching INIT
   info  - transport end
不知何故,套接字在服务器附加套接字回调之前发出INIT


为什么会这样?另外,正确的方法是什么

我猜您希望订单是这样的

连接INIT之前的套接字 套接字已完成连接INIT 在客户端发出之前 客户端发出后 从给出的少量代码来看,问题可能有两个

首先,也可能是主要问题,是ioClient.connect不会立即连接。您需要向它传递某种回调,并发出INIT,然后在测试实际连接后执行其回调函数

其次,您可能应该对运行命令执行相同的操作。listen不会立即开始侦听,因此如果它在执行测试时还没有开始侦听,那么您偶尔会得到不一致的结果。您还应该将安装程序的回调传递给io.listen

更新

为了便于侦听,就像节点中的大多数内容一样,socketio服务器的侦听方法是异步的。调用该方法会告诉它开始侦听,但在后台,服务器会设置网络设备开始侦听。就像节点的核心侦听一样,socket.io的版本接受一个回调参数,该参数在服务器启动并侦听后调用

io.listen(port, {'log level': 2}, callback);

除非socket.io开始向您提供有关连接失败的错误,否则这可能不是问题,但需要记住。将异步操作视为瞬时操作是一种简单的方法,可以使错误偶尔出现。由于您的跑步记录是完整的,所以我认为一般来说,不仅仅是为了测试,传递回调以运行将是一个非常好的主意。

谢谢您的帮助。你也应该把安装程序的回调传递给io。听,这是什么意思?就io而言,listen实际上并不接受回调。即使这样,这意味着我将把代码从我的测试文件注入到我的实际服务器?