node.js+socket.io部署到线上无法建立链接?
在项目中发现,请求监听 3002 端口、socket.io 监听 8090 端口在本地运行无误,但传到线上发现无法与 socket.io 建立链接以下是我得代码:
const fs = require('fs')
const path = require('path')
const http = require('http')
const https = require('https')
const express = require('express')
const app = express()
// 允许跨域
app.all('*', (req, res, next) => {
res.header('Access-Control-Allow-Origin', '*')
res.header('Access-Control-Allow-Headers', 'content-type')
res.header('Access-Control-Allow-Methods', 'DELETE,PUT,POST,GET,OPTIONS')
if (req.method.toLowerCase() == 'options')
res.sendStatus(200)
else
next()
})
// 获取 https 请求参数
const bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({
extended: false
}))
app.use(bodyParser.json())
// 连接 mongodb 数据库 writeOff
const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost/writeOff', {
useNewUrlParser: true,
useUnifiedTopology: true
}).then(doc => {
console.log('mongoose.connect success')
}).catch(err => {
console.log('mongoose.connect fail', err)
})
const schema = {
name: String,
bulletChat: String,
fabulous: 0
}
var Kitten = mongoose.model('meetings', schema)
app.post('/update', (req, res) => {
Kitten.findByIdAndUpdate(req.body.id, {
}, (err, doc) => {
if (err) {
res.send('updata fail')
return
}
console.log('updata success', doc)
res.send(doc)
})
})
app.get('/get', (req, res) => {
Kitten.find().then(doc => {
res.send(doc)
}).catch(err => {
res.send(err)
})
})
// 创建服务
const options = {
key: fs.readFileSync('../../FreeSSL.cn/bj.cn.key', 'utf8'),
cert: fs.readFileSync('../../FreeSSL.cn/bj.cn.crt', 'utf8')
}
// const server = http.createServer(app)
const server = https.createServer(options, app)
// 监听 3002 端口
// server.listen(3002, '0.0.0.0', () => {
// console.log('Http 3002 Server Open')
// })
server.listen(3002, '0.0.0.0', () => {
console.log('Https 3002 Server Open')
})
const server2 = https.createServer(options, app)
const io = require('socket.io')(server2)
// 监听连接事件
io.on('connection', socket => {
console.log('io connection success')
socket.on('disconnect', err => {
console.log('io connection break', err)
})
socket.on('to-server', data => {
console.log('client fail:' + data)
Kitten.create(data).then(() => {
console.log('bulletChat submit success')
io.emit('to-client', data)
}).catch((err) => {
console.log(err)
})
})
})
// 监听 8001 端口
// server.listen(8090, function(){
// console.log('app run at 127.0.0.1:8090')
// })
server2.listen(8090, '0.0.0.0', () => {
console.log('Https 8090 Server Open')
})
我不确定是因为线上使用得 Https 导致得还是其他原因,目前没有排查出来还望大拿可以指点迷津,谢谢!
回复
1个回答

test
2024-07-17
Nginx增加如下配置:
location /websocket {
proxy_buffering off;
#rewrite ^/websocket/(.*)$ /$1 break;
proxy_pass http://xxx.xx.xxx.xx:3000/websocket;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#升级http1.1到 websocket协议
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
回复

适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容