Server.listeners 不是一个函数

onT*_*net 6 javascript websocket npm

我按照这个 websockets 教程来学习如何将 Socket.IO 集成到 Angular 项目中。我已完全按照这些步骤操作,但是当我尝试运行 websockets 服务器项目时,出现以下错误:

类型错误:server.listeners 不是 Server.attach 中的函数 (\ws-server\node_modules\engine.io\lib\server.js:455:26)

在 server.js 的第 455 行,我们看到了这段代码

  // cache and clean up listeners
  var listeners = server.listeners('request').slice(0);
Run Code Online (Sandbox Code Playgroud)

我很困惑为什么我会看到这个。我已经更新了express和Socket.IO,但仍然遇到同样的问题。如果需要,我可以提供角度代码,但我认为它不相关。

这是我的服务器代码的样子

let app = require('express')();
let http = require('http').Server(app);
let io = require('socket.io')('http');

io.on('connection', (socket) =>{
    //Log when a user connects
    console.log('user connected');

    //Log when a client disconnects
    socket.on('disconnect', function(){
        console.log('user disconnected');
    });

    //When we receive a message event from our client, print out the 
    //contents of that message and echo it back to our clients using emit()

    socket.on('message', (message)=>{
        console.log('message received: ' + message);
        io.emit('message', {type:'new-message', text: message});
    });
});

//initialize server on port 5000
http.listen(5000, () =>{
    console.log('started on port 500');
});
Run Code Online (Sandbox Code Playgroud)

这是完整的错误

TypeError: server.listeners 不是 Server.attach (C:\Users***\Documents\poker game\ws-server\node_modules\engine.io\lib\server.js:455:26) 处的函数。在 Server.initEngine (C:\Users***\) 附加 (C:\Users***\Documents\poker game\ws-server\node_modules\engine.io\lib\engine.io.js:124:10) Documents\poker game\ws-server\node_modules\socket.io\lib\index.js:310:21) 位于 C:\Users***\Documents\poker game\ws-server\node_modules\socket.io\lib \index.js:295:10 在 Encoder.encode (C:\Users***\Documents\poker game\ws-server\node_modules\socket.io-parser\index.js:135:5) 在 Server.listen .Server.attach (C:\Users***\Documents\poker game\ws-server\node_modules\socket.io\lib\index.js:290:16) 在新服务器 (C:\Users***\服务器上的 Documents\poker game\ws-server\node_modules\socket.io\lib\index.js:59:17) (C:\Users***\Documents\poker game\ws-server\node_modules\socket.io \lib\index.js:44:41) 在对象处。(C:\Users***\Documents\poker game\ws-server\index.js:3:30) 在 Module._compile (module.js:652:30)

小智 7

您不小心传入了字符串文字('http')而不是(http)变量名称。

改变这个:

let http = require('http').Server(app);
let io = require('socket.io')('http');
Run Code Online (Sandbox Code Playgroud)

对此:

let http = require('http').Server(app);
let io = require('socket.io')(http);
Run Code Online (Sandbox Code Playgroud)

今天我自己也犯了同样的错误。:)


Abd*_*rif 0

将您的服务器更改为此,我还没有测试它,但它应该可以工作

 var app = require('express')();
    var http = require('http').Server(app);
    var io = require('socket.io')(http);

    app.get('/', function(req, res){
      res.sendFile(__dirname + '/index.html');
    });
   io.on('connection', function(socket){
  socket.on('chat message', function(msg){
    io.emit('chat message', msg);
  });
});

    http.listen(5000, function(){
      console.log('listening on *:5000');
    });
Run Code Online (Sandbox Code Playgroud)

我不熟悉 Angular,但是,这就是您的代码在使用 JQuery 的前端中的样子

<script>
  $(function () {
    var socket = io();
    $('form').submit(function(){
      socket.emit('chat message', $('#m').val());
      $('#m').val('');
      return false;
    });
    socket.on('chat message', function(msg){
      $('#messages').append($('<li>').text(msg));
    });
  });
</script>
Run Code Online (Sandbox Code Playgroud)