socket.io 连接在生产环境中失败,在 localhost 中工作

Ali*_*gan 6 sockets node.js express socket.io netlify

我在 server.js 中有这个

//socket io config
const server = require('http').createServer(app)
const io = require('socket.io')(server)
io.on('connection', function (socket) {
  socket.on('SOCKET_COMMENT_RECEIVED', ({ notification }) => {
    io.emit(`SOCKET_COMMENT_RECEIVED`, notification)
  })
  //and many more
})
Run Code Online (Sandbox Code Playgroud)

在我的客户端(反应)

import io from 'socket.io-client'
const socket = io('localhost:3001') // working in localhost
Run Code Online (Sandbox Code Playgroud)

在我的产品中我做了这个检查

let socket = io('localhost:3001')
if(process.env.NODE_ENV === 'production') { socket = 
  io('https://api.example.com:3001') 
}
Run Code Online (Sandbox Code Playgroud)

为什么会这样呢?我不认为这是 cors 问题,因为我已经这样做了

app.use(cors({
  origin: true,
  credentials: true
}))
Run Code Online (Sandbox Code Playgroud)

我的 package.json 依赖项

"socket.io": "^2.1.1",
"socket.io-client": "^2.1.1",
Run Code Online (Sandbox Code Playgroud)

San*_*nde 0

在您的服务器代码中,请添加以下行

io.set('origins', '*:*');
Run Code Online (Sandbox Code Playgroud)

所以你的代码将是

  //socket io config
  const server = require('http').createServer(app)
  const io = require('socket.io')(server)
  io.set('origins', '*:*');
  io.on('connection', function (socket) {
    socket.on('SOCKET_COMMENT_RECEIVED', ({ notification }) => {
      io.emit(`SOCKET_COMMENT_RECEIVED`, notification)
    })
    //and many more
  })
Run Code Online (Sandbox Code Playgroud)

如需更多帮助,请遵循教程和问题。

源代码可在此处获取。

希望对你有帮助 !!