首页 > 解决方案 > 为什么客户端连接在heroku中保持自我重新连接?

问题描述

我目前正在使用 Heroku 托管一个简单的聊天程序,并尝试使用 heroku logs -t 来检查问题。我发现我的客户端将继续连接到服务器并自行断开连接。

我试图从客户端发送一条消息,而服务器端也没有收到任何东西。

heroku 日志

服务器.js

const PORT = process.env.PORT || 3000;
const http = require('http').createServer(app);
const io = require('socket.io')(http, {
  cors: {
    origins: ['example.com']//my own domain
  }
});
app.use((req, res, next) => {
  res.setHeader("Access-Control-Allow-Origin", "*");
  res.header(
    "Access-Control-Allow-Headers",
    "Origin, X-Requested-With, Content-Type, Accept"
  );
  next();
});
app.get('/', (req, res) => {
  res.send('<h1>Welcome</h1>');
});
io.on('connection', (socket) => {
  console.log('a user connected');
  socket.on('disconnect', () => {
    console.log('user disconnected');
  });
  socket.on('newActivity',(msg)=>{
    socket.broadcast.emit('activity',msg);
  })
  socket.on('message',(msg)=>{
    console.log(msg);
    socket.broadcast.emit('message-broadcast',msg);
  })
});

http.listen(PORT, () => {
  console.log('listening on *:3000');
}); 

标签: node.jsherokusocket.io

解决方案


该问题可能是您需要在 Heroku 应用上启用会话关联。如果您在 Heroku 上使用 WebSocket,这将确保您的 WebSocket 客户端继续保持连接到同一个后端测功机。

这一点很重要,因为 Heroku 是一个短暂的架构:请求通常被路由到一个随机的测功机,而测功机被设计为一直移动/停止/启动。

如果您想了解更多信息,请阅读我上面链接的文章以及涵盖最佳实践和其他相关信息的Heroku Node + WebSockets 文档。


推荐阅读