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

Socket.io连接报错RSV1 must clear:API请求后无法连接问题

在同一服务器部署Express REST API与Socket.io时的连接问题

Socket.io在发起任何API请求前可正常连接,但调用API后再尝试连接会抛出Error: Invalid WebSocket frame: RSV1 must be clear错误。

业务场景说明:Socket连接时需要验证用户JWT令牌,前端需先调用登录API完成登录,再进入消息页面时连接Socket,但登录API调用完成后,Socket无法正常建立连接。

服务器核心代码(server.js)

const app = require('./app');
const debug = require('debug')('node-angular');
const http = require('http');
const dotenv = require('dotenv');
const colors = require('colors');
const socket = require('socket.io');
const { path } = require('./config/serverStatusConfig');

// Load env vars
dotenv.config({ path: './config/config.env' });

const normalizePort = (val) => {
    let port = parseInt(val, 10);

    if (isNaN(port)) {
        // named pipe
        return val;
    }

    if (port >= 0) {
        // port number
        return port;
    }

    return false;
};

const onError = (error) => {
    if (error.syscall !== 'listen') {
        throw error;
    }
    const bind = typeof port === 'string' ? 'pipe ' + port : 'port ' + port;
    switch (error.code) {
        case 'EACCES':
            console.error(bind + ' requires elevated privileges'.orange.underline);
            process.exit(1);
            break;
        case 'EADDRINUSE':
            console.error(`${bind} is already in use`.bgBrightRed);
            process.exit(1);
            break;
        default:
            throw error;
    }
};

const onListening = () => {
    const addr = server.address();
    const bind = typeof port === 'string' ? 'pipe ' + port : 'port ' + port;
    debug('Listening on ' + bind);
};

const port = normalizePort(process.env.PORT || '3000');

app.set('port', port);

const server = http.createServer(app);

const io = socket(server);
require('./socket')(io);

server.on('error', onError);
server.on('listening', onListening);
server.listen(port);
console.log(`server running in ${process.env.NODE_ENV} mode on port ${port}`.yellow.bold);

// Handle unhandled promise Rejections (Global)
process.on('unhandledRejection', (err, promise) => {
    console.log(`Error:  ${err.message}`.red.bold);
    // Close server & exit process
    server.close(() => process.exit(1));
});

Socket配置文件(server.js中引入)

const jwt = require("jsonwebtoken");

const rootSocket = (io) => {

    io.use(function (socket, next) {
        if (socket.handshake.query && socket.handshake.query.token) {
            jwt.verify(socket.handshake.query.token, process.env.JWT_SECRET, function (err, decoded) {
                if (err) return next(new Error('Authentication error'));
                socket.decoded = decoded;
                next();
            });
        }
        else {
            next(new Error('Authentication error'));
        }
    }).on('connection', (socket) => {
        console.log('New WS Connection...'.green);

        // Emit connection success message
        socket.emit('connection', {
            message: 'Connected to socket server successfully',
        });

        require('./controllers/chat')(socket, io);
        require('./controllers/realtime-notifications')(socket, io);

        // Runs when client disconnects
        socket.on('disconnect', () => {
            io.emit('message', 'A user has left the chat');
        });
    })
}

module.exports = rootSocket;

错误截图

错误截图

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 10:50:37