socket.io 连接在生产中失败,在 localhost 中工作
Posted
技术标签:
【中文标题】socket.io 连接在生产中失败,在 localhost 中工作【英文标题】:socket.io connect failed on production, working in 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) 吗? github.com/react-boilerplate/react-boilerplate/issues/1413 【参考方案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 而没有额外的配置以上是关于socket.io 连接在生产中失败,在 localhost 中工作的主要内容,如果未能解决你的问题,请参考以下文章
Dotnet 5 Kubernetes TLS 在生产中失败