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
相关产品推荐
相关产品推荐

