首页 > 解决方案 > 带有 socket.io、express 和 nodejs 的项目出现错误:“在 WebSocket 握手期间:意外的响应代码:400”

问题描述

所以我正在开发一个通过socket.io拥有大厅系统的在线乘数游戏。大厅系统允许用户加入和离开游戏,所有这些都由 socket.io 管理。当我在 localhost 上测试站点时,它运行良好,但是当我将项目放到网络上时,我遇到了一个问题,即不允许用户像以前一样顺利地离开和加入房间。

当用户发送 POST 请求加入大厅时,我使用 ejs 来渲染大厅 html,其中包含一个名为 lobby.ejs 的文件,该文件具有以下相关代码:

    <script> let lobby = <%- JSON.stringify(data.lobby) %>; let name = <%- JSON.stringify(data.name) %></script>
    <script src="./js/ejs/ejs.js"></script>
    <script src="./js/lobby.js"></script> 

在 lobby.js 中,我这样做: const socket = io()

这是我的 app.js 文件中服务器端的相关内容:

var express = require('express')
var bp = require('body-parser')
var app = express()

var server = require('http').createServer(app)

var urlEncodedParser = bp.urlencoded({ extended: false })

app.set('view engine', 'ejs')

app.use(express.static('views'))

app.get('/', (req, res) => {
    res.render('index', {qs: req.query})
})

app.post('/lobby', urlEncodedParser, (req, res) => {
    res.render('lobby', {data: req.body})
})

const PORT = process.env.PORT || 8080
server.listen(PORT, () => {
    //console.log('server started')
})

var io = require('socket.io')(server)

问题是每当用户进入大厅时,我与const socket = io() 我建立套接字连接时都会收到握手错误。然后,当用户关闭选项卡时,不会在大厅中为所有其他用户更新玩家列表(这在 localhost 上有效,没有问题)。

我知道 400 错误意味着服务器从客户端请求中得到了一些它无法理解或不喜欢的东西,但我不确定当它在 localhost 上正常工作时会发生什么。

如果我遗漏了任何重要信息,请告诉我。这是我第一次发布问题,所以我对最佳实践还不太熟悉。

标签: node.jsexpresssocketswebsocketsocket.io

解决方案


推荐阅读