Socket.io и Express получают ошибку "не имеет метода socket" - PullRequest
1 голос
/ 29 февраля 2012

Вот ошибка, которую я получаю при попытке протестировать базовую настройку Socket.io и Express (согласно примеру на сайте socket.io):

/Users/scottcorgan/Projects/sevenly/campaigns/node_modules/socket.io/lib/manager.js:659

        var socket = this.namespaces[i].socket(data.id, true);



 ^

TypeError: Object function extend(another) {
  var properties = Object.keys(another);
  var object = this;
  properties.forEach(function (property) {
    object[property] = another[property];
  });
  return object;
} has no method 'socket'
    at Manager.handleClient (/Users/scottcorgan/Projects/sevenly/campaigns/node_modules/socket.io/lib/manager.js:659:41)
    at Manager.handleUpgrade (/Users/scottcorgan/Projects/sevenly/campaigns/node_modules/socket.io/lib/manager.js:588:8)
    at HTTPServer.<anonymous> (/Users/scottcorgan/Projects/sevenly/campaigns/node_modules/socket.io/lib/manager.js:119:10)
    at HTTPServer.emit (events.js:88:20)
    at Socket.<anonymous> (http.js:1390:14)
    at TCP.onread (net.js:334:27)

Цените любую помощь, которую я могу получить, пожалуйста:)

Ответы [ 2 ]

1 голос
/ 10 апреля 2012

Эта проблема связана с тем, что вы или используемая вами библиотека добавляете функции к Object.prototype .

Таким образом, этот код:

Object.prototype.foo = function() {};
Object.prototype.bar = function() {};

var myObj = { x: 1 };

for (var i in myObj) {
   console.log(i)
}

напечатает: x, foo, bar (не обязательно в таком порядке), а не только x как выОжидайте.

В вашем случае это происходит в manager.js:

// initialize the socket for all namespaces
for (var i in this.namespaces) {
    var socket = this.namespaces[i].socket(data.id, true);

    // echo back connect packet and fire connection event
    if (i === '') {
        this.namespaces[i].handlePacket(data.id, { type: 'connect' });
    }
}

Этот код не ожидает, что встретится с объявленным ключом: extension , как вы можетепосмотрите из трассировки стека ошибки:

TypeError: Object function extend(another) {
  var properties = Object.keys(another);
  var object = this;
  properties.forEach(function (property) {
    object[property] = another[property];
  });
  return object;
} has no method 'socket'

программа фактически пытается вызвать socket () в extension функция.

См. Разговор Боба здесь о добавлении функций в Object.prototype .

Что касается решения, вы можете добавить условный оператор в менеджере.js вот так:

// initialize the socket for all namespaces
for (var i in this.namespaces) {
    if ('extend' == i) continue;  // ADDED
    var socket = this.namespaces[i].socket(data.id, true);

    // echo back connect packet and fire connection event
    if (i === '') {
        this.namespaces[i].handlePacket(data.id, { type: 'connect' });
    }
}

или вы можете удалить Object.prototype.extend = function (...) {} объявление, которое является моимличные предпочтения.

0 голосов
/ 01 марта 2012

Ваш this.namespaces[i].socket(data.id, true); не существует. Сделайте что-то вроде console.log(typeof this.namespaces[i].socket(data.id, true)); Вы, вероятно, получите undefined

Бьюсь об заклад, один из элементов вашего массива пространств имен отсутствует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...