You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

集成Socket.IO到Angular项目时遇TypeError: server.listeners is not a function错误

Fixing "TypeError: server.listeners is not a function" in Socket.IO + Angular Setup

Hey there, let's break down this error you're hitting—it's a super common gotcha when setting up Socket.IO, especially if you're mixing Express and Socket.IO without the right setup.

The root issue here is that the server object you're passing to Socket.IO isn't a standard Node.js HTTP server instance. The engine.io library (which Socket.IO uses under the hood) is trying to call server.listeners('request'), but that method doesn't exist on whatever object you're feeding it.

Here are the most likely fixes to try:

1. Stop passing your Express app directly to Socket.IO

This is the #1 cause of this error. A lot of folks make the mistake of doing this:

// ❌ Wrong: Passing Express app instead of HTTP server
const express = require('express');
const { Server } = require('socket.io');

const app = express();
const io = new Server(app); // This is the problem!

Instead, you need to wrap your Express app in a Node.js HTTP server first, then pass that server to Socket.IO:

// ✅ Correct: Use http.createServer to wrap your Express app
const express = require('express');
const http = require('http');
const { Server } = require('socket.io');

const app = express();
const server = http.createServer(app); // Wrap app in HTTP server
const io = new Server(server); // Pass the HTTP server to Socket.IO

// Also, make sure you listen with the server, not the Express app
server.listen(3000, () => {
  console.log('WebSocket server running on port 3000');
});

Express's app object isn't a full HTTP server—it's just a request handler. The http.createServer() method turns it into a proper server instance that has the listeners method engine.io needs.

2. Check for dependency version mismatches

If you're using an older version of Socket.IO or engine.io with a newer Node.js release, you might hit API incompatibilities. For example, some older versions of engine.io don't handle changes to Node.js's server API in v18+.

Try updating your dependencies to the latest compatible versions:

npm update socket.io engine.io

You can also cross-check the Socket.IO docs to confirm which Node.js versions are supported by your installed Socket.IO version.

3. Verify you're using a standard HTTP/HTTPS server

If you're using HTTPS instead of HTTP, make sure you're creating a server with Node.js's https module, not a custom server implementation:

// Example for HTTPS
const https = require('https');
const fs = require('fs');
const express = require('express');
const { Server } = require('socket.io');

const app = express();
const serverOptions = {
  key: fs.readFileSync('./path/to/your/key.pem'),
  cert: fs.readFileSync('./path/to/your/cert.pem')
};
const server = https.createServer(serverOptions, app);
const io = new Server(server);

server.listen(3001, () => {
  console.log('Secure WebSocket server running on port 3001');
});

Quick Debug Tip

If you're still stuck, add a console log right before initializing Socket.IO to check what your server object looks like:

console.log('Server object:', server);
console.log('Does server have listeners method?', typeof server.listeners === 'function');

If the second log returns false, you definitely aren't passing a proper HTTP server instance.


内容的提问来源于stack exchange,提问作者onTheInternet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:31:20