【问题标题】:socket.io connect failed on production, working in localhostsocket.io 连接在生产中失败,在 localhost 中工作
【发布时间】:2019-02-22 00:02:13
【问题描述】:

我在 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
})

在我的客户中(反应)

import io from 'socket.io-client'
const socket = io('localhost:3001') // working in localhost

在我的产品中,我会进行此检查

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

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

app.use(cors({
  origin: true,
  credentials: true
}))

我的 package.json 依赖

"socket.io": "^2.1.1",
"socket.io-client": "^2.1.1",

【问题讨论】:

  • 您是否在生产端口中提到了您的端口号?
  • const socket = io('http://{你的机器的 ip}:4001')
  • @SantoshShinde 是的,我就是这么做的。我是否必须在 node.js 中设置反向代理或类似的东西?
  • 你能添加你的客户端的 package.json(react) 吗?

标签: node.js sockets express socket.io netlify


【解决方案1】:

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

io.set('origins', '*:*');

所以你的代码将是

  //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
  })

如需更多帮助,请关注this 教程和this 问题。

源代码在here.

希望对你有帮助!!

【讨论】:

  • 为什么io.set('origins', '*:*') 不同于app.use(cors({ origin: true, credentials: true })) ??
  • 我遇到了同样的错误。在 Firefox 中,我看到此错误 Cross-Origin Request Blocked: The Same Origin Policy disallow
  • 你能用 app.use(cors())
  • 奇怪的是我在本地运行它没有问题,你有没有尝试将你的 repo 发布到生产环境?
  • 是的,它正在工作,但我只是使用 cors 而没有额外的配置
猜你喜欢
  • 2022-01-20
  • 2016-09-03
  • 2021-04-25
  • 1970-01-01
  • 2011-11-05
  • 2017-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多