2015-10-27 15 views
4

Я следую этому руководству link (шаг 7). я успешно установлен как Node.js либо socket.js, но когда я перейти на страницу и попытаться отправить изображение я получаю эту ошибку на сервереТипError: io.sockets.clients не является функцией

Missing error handler on `socket`. 
TypeError: io.sockets.clients is not a function 
at Socket.<anonymous> (C:\Users\utente\Projects\webrtc\server.js:30:31) 
at emitOne (events.js:77:13) 
at Socket.emit (events.js:169:7) 
at Socket.onevent (C:\Users\utente\Projects\webrtc\node_modules\socket.io\lib\socket.js:330:8) 
at Socket.onpacket (C:\Users\utente\Projects\webrtc\node_modules\socket.io\lib\socket.js:290:12) 
at Client.ondecoded (C:\Users\utente\Projects\webrtc\node_modules\socket.io\lib\client.js:193:14) 
at Decoder.Emitter.emit (C:\Users\utente\Projects\webrtc\node_modules\socket.io\node_modules\socket.io-parser\node_modules\component-emitter\index.js:134:20) 
at Decoder.add (C:\Users\utente\Projects\webrtc\node_modules\socket.io\node_modules\socket.io-parser\index.js:247:12) 
at Client.ondata (C:\Users\utente\Projects\webrtc\node_modules\socket.io\lib\client.js:175:18) 
at emitOne (events.js:77:13) 

мой файл server.js является

var os = require('os'); 
var static = require('node-static'); 
var http = require('http'); 
var socketIO = require('socket.io'); 

var fileServer = new(static.Server)(); 
var app = http.createServer(function (req, res) { 
fileServer.serve(req, res); 
}).listen(2013); 

var io = socketIO.listen(app); 
io.sockets.on('connection', function (socket){ 

// convenience function to log server messages on the client 
function log(){ 
    var array = [">>> Message from server:"]; 
    array.push.apply(array, arguments); 
    socket.emit('log', array); 
} 

socket.on('message', function (message) { 
    log('Client said:', message); 
    // for a real app, would be room only (not broadcast) 
    socket.broadcast.emit('message', message); 
}); 

socket.on('create or join', function (room) { 
    log('Request to create or join room ' + room); 

    var numClients = io.sockets.clients(room).length; 
    log('Room ' + room + ' has ' + numClients + ' client(s)'); 

    if (numClients === 0){ 
     socket.join(room); 
     socket.emit('created', room, socket.id); 

    } else if (numClients === 1) { 
     socket.join(room); 
     socket.emit('joined', room, socket.id); 
     io.sockets.in(room).emit('ready'); 

    } else { // max two clients 
     socket.emit('full', room); 
    } 
}); 

socket.on('ipaddr', function() { 
    var ifaces = os.networkInterfaces(); 
    for (var dev in ifaces) { 
     ifaces[dev].forEach(function (details) { 
      if (details.family=='IPv4' && details.address != '127.0.0.1') { 
       socket.emit('ipaddr', details.address); 
      } 
     }); 
    } 
    }); 

}); 

index.html получается

<!DOCTYPE html> 
<html> 
<head> 
    <meta name="keywords" content="JavaScript, WebRTC" /> 
    <meta name="description" content="WebRTC codelab" /> 
    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1"> 

    <title>WebRTC codelab: step X</title> 
    <link rel="stylesheet" href="css/main.css"> 
</head> 
<body> 
    <h1>WebRTC codelab: step X</h1> 

    <p> 
     Room URL: <br> 
     <code id="url">...</code> 
    </p> 

    <video class="camera" autoplay></video> 
    <div class="controls"> 
     <canvas id="photo" style="width: 200px; height: 150px; border: 1px solid #ccc;"></canvas> 
     <p> 
      <button id="snap">snap</button>-then-<button id="send">send</button> 
      <br> - or - <br> 
      <button id="snapAndSend">snap & send</button> 
     </p> 
    </div> 

    <div class="incoming"> 
     <h2>Incoming photos</h2> 
     <div id="trail"></div> 
    </div> 

    <script src="node_modules\socket.io\node_modules\socket.io-client\socket.io.js"></script> 
    <script src="js/lib/adapter.js"></script> 
    <script src="js/main.js"></script> 

</body> 

любая помощь?

Большое спасибо

с io.sockets.clients [номер] .length; я решил эту ошибку, но теперь я получаю

Missing error handler on `socket`. 
TypeError: Cannot read property '8a675bfe1203e' of undefined 
at Socket.<anonymous> (C:\Users\utente\Projects\webrtc\server.js:30:38) 
at emitOne (events.js:77:13) 
at Socket.emit (events.js:169:7) 
at Socket.onevent (C:\Users\utente\Projects\webrtc\node_modules\socket.io\lib\socket.js:330:8) 
at Socket.onpacket (C:\Users\utente\Projects\webrtc\node_modules\socket.io\lib\socket.js:290:12) 
at Client.ondecoded (C:\Users\utente\Projects\webrtc\node_modules\socket.io\lib\client.js:193:14) 
at Decoder.Emitter.emit (C:\Users\utente\Projects\webrtc\node_modules\socket.io\node_modules\socket.io-parser\node_modules\component-emitter\index.js:134:20) 
at Decoder.add (C:\Users\utente\Projects\webrtc\node_modules\socket.io\node_modules\socket.io-parser\index.js:247:12) 
at Client.ondata (C:\Users\utente\Projects\webrtc\node_modules\socket.io\lib\client.js:175:18) 
at emitOne (events.js:77:13) 
+0

Возможный дубликат [Как получить список клиентов комнаты в socket.io 1.0] (http://stackoverflow.com/questions/23858604/how-to-get-rooms-clients-list-in-socket-io- 1-0) – Vishnu

ответ

2

Из того, что говорит журнал ошибка выдается в строке 30: var numClients = io.sockets.clients(room).length;

Причина заключается в том, что метод io.sockets.clients(room); не дольше работать на Socket.io v1 .0+

Вы можете получить список клиентов по телефону:

var clientsList = io.sockets.adapter.rooms[room]; 
var numClients = clientsList.length; 
+0

с io.sockets.clients [room] .length; я решил ошибку, но теперь я получаю Missing обработчик ошибок на 'socket'. TypeError: Невозможно прочитать свойство «8a675bfe1203e» не определено на Socket. (C: \ Users \ utente \ Projects \ webrtc \ server.js: 30: 38) – elgeko

0

Вы можете только изменение линии трески е к

var numClients = io.sockets.adapter.rooms[room]!=undefined ? Object.keys(io.sockets.adapter.rooms[room]).length:0; 
0

Проблема появляется, если вы обновите зависимости до последних версий:

"dependencies": { 
    "mime": "^1.3.4", 
    "socket.io": "^1.4.5" 
} 

в то время как она работает, если вы используете зависимости, указанные в книге

"dependencies": { 
    "socket.io": "~0.9.6", 
    "mime": "~1.2.7" 
} 

Я проверил пример в книге NodeJs в действии, и, конечно, это не сработает, если вы используете последние версии socket.io, у вас будет следующее 2 линии, чтобы заставить его работать:

От:

var usersInRoom = io.sockets.clients(room); 

To:

var usersInRoom = io.of('/').in(room).clients; 

и от:

socket.emit('rooms', io.sockets.manager.rooms); 

к:

socket.emit('rooms', io.of('/').adapter.rooms); 

Приветствую!

Смежные вопросы