javascript - React 中的 Socket.IO 连接导致持续重新加载

标签 javascript node.js reactjs socket.io

我以前从未遇到过这个问题,而且似乎无法弄清楚是什么原因造成的。我正在开发一个具有 Express 和 Socket.io 后端和 React 前端(使用 create-react-app)的项目。

server/index.js...

相当标准,据我所知应该有效......

const app = express();
const server = app.listen(config.port);
io.attach(server);

if (process.env.NODE_ENV === 'production') {
  app.use(express.static(path.join(__dirname, '..', 'build')));
  app.get('/', (req, res) => res.sendFile(path.join(__dirname, '..', 'build', 'index.html')));
}

io.on('connection', socket => {
  *blah blah blah*
});

src/index.js...

class App extends Component {
  constructor(props) {
    super(props);
    this.socket = io.connect(window.location);
  }

  render = () => {
    if (view === 'start') {
      return <StartContainer socket={this.socket} />;
    } else if (view === 'game') {
      return <Game socket={this.socket} />;
    }
  }
}

我实际上正在测试部署,因此我一直在运行 set NODE_ENV=product&& node server/index.js 来测试 Express 应用中的文件服务。

在开发过程中,我运行两台服务器:一台使用 create-react-app,另一台用于 Express & Socket.io 服务器。开发中不会出现此问题。

因此,我启动服务器,转到本地主机,页面不断刷新。如果我从 App 中删除套接字连接,问题就会消失。希望我没有忽略这里 super 简单的事情。如有任何帮助,我们将不胜感激。

为了简洁起见,我省略了一些应用程序组件,但如果您怀疑问题可能出在其他地方,请告诉我,我将添加更多内容。

编辑问题肯定出在客户端。我served构建的 React 项目也有同样的问题。

最佳答案

问题已解决

之前的连接是这样的:

this.setState({ socket: io.connect(config.socketIO) });

其中 config.socketIOprocess.env.NODE_ENV === '生产' ? window.location : 'http://localhost:3001'

我认为这会起作用,因为在文档中它说 io() 默认为 window.location。显然传递 window.location 是不一样的。到目前为止的工作解决方案是...

if (process.env.NODE_ENV === 'production') {
  this.setState({ socket: io.connect() });
} else {
  this.setState({ socket: io.connect('http://localhost:3001') });
}

我还应该注意到,我将连接移至 componentDidMount 中,因此是 setState

关于javascript - React 中的 Socket.IO 连接导致持续重新加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50662455/

相关文章:

c# - 发生错误 .", ExceptionMessage: "提供的 'HttpContent' 实例无效

javascript - ReactJS (ReactTestUtils) 理解哪些事件类型?

reactjs - 阻止 `useSelector` 重新渲染组件?

javascript - 将多个元素添加到所有相等的数组中

javascript - 是否可以以可从多个 URI 请求的方式缓存 HTML 页面?

node.js - Mongo TypeError : MongoClient. 关闭不是函数

node.js - 在 angular2 quickstart 中安装 npm 的 Node 模块过多

javascript - 使用掩码在输入上键入方向

javascript - 将 css3 转换添加到当前 css3 转换值

javascript - 运行 Node server.js 并重新播种数据库时,表被删除。 Sequelize