node.js - TypeError : io. sockets.clients 不是函数

标签 node.js socket.io

我正在按照此 link 上的教程进行操作(第 7 步)。 我成功安装了 node.js 和 socket.js,但是当我转到页面并尝试发送图像时,我在服务器上收到此错误

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[room].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)

最佳答案

从日志中可以看出,错误是在第 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;

关于node.js - TypeError : io. sockets.clients 不是函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33373176/

相关文章:

node.js - 在changeResourceRecordSets 上出现 InvalidInput 错误

node.js - npm 启动后有没有办法在终端中获取用户输入?

javascript - 无法发送到特定房间和客户端(Socket.io 2.0.2)

node.js - 为什么我需要刷新页面才能获得新状态React Express

javascript - 为什么 mongoose.connect() 在不作为 mongoose 对象的方法存在时工作得很好?

javascript - Heroku 本地持久存储

javascript - ionic 应用程序不会连接到 Socket.IO

Javascript套接字io隐藏ip地址进行连接

Node.js/q 为什么这个函数没有被调用?

node.js - Socket.io从客户端发送二进制数据到服务器