node.js+socket.io部署到线上无法建立链接?

作者站长头像
站长
· 阅读数 15

在项目中发现,请求监听 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个回答
avatar
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;
}
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容