NodeJS 快速与安全的WebSocket端口冲突?

31moq8wy  于 2022-12-26  发布在  Node.js
关注(0)|答案(1)|浏览(185)

我找不到一个完全类似的职位,所以我在这里问。
我尝试使用相同的端口为我的安全WebSocket(wss)和快速应用程序。但是当我使用A)app.listen()--〉socket breaks B)当我使用server.listen()=〉快速breaks。我被迫用不同的端口做两次侦听。不理想。

const app = express()
const server = https.createServer({ key, cert }, app);  
const wss = new WebSocket.Server({ server})

wss.on ...

server.listen(3002);
app.listen(3001);

我试着只保留server.listen,套接字工作,但express中断。反之亦然,也会中断另一个。双端口是唯一的出路吗?但这意味着我的负载平衡器,我必须分裂它。
我没有这个问题与正常的ws.只有发生与安全的websockets ws.
当我删除应用程序。听它给我一个“xxx没有发送任何数据”x1c 0d1x
当我把它加回去(但在不同的端口上)时,它就像预期的那样工作了。
下面是我的全部代码的大部分

const WebSocket = require('ws');
const fs = require('fs');

const https = require('https');
const express = require('express')
require('dotenv').config()
const keypath = process.env.environment=="production" ? process.env.key : 'localhost.key';
const certpath = process.env.environment=="production" ? process.env.cert : 'localhost.crt';
console.log("environment is ",process.env.environment)
const key = fs.readFileSync(keypath);
const cert = fs.readFileSync(certpath);
const bodyParser = require('body-parser')
const mongoose = require('mongoose')
const cors = require('cors')
const helmet = require('helmet')
const morgan = require('morgan')
const { MONGO_URI } = require('./config')
const worldRoutes = require('./src/routes/api/world_controller')
const environmentRoutes = require('./src/routes/api/environment_controller')
const worldObjectRoutes = require('./src/routes/api/worldObject_controller')
const interactionRoutes = require('./src/routes/api/interaction_controller')
const app = express()

app.use(helmet())
app.use(bodyParser.json())
app.use(cors())
app.use(morgan(':method :url :status :res[content-length] - :response-time ms'))
app.use(express.json())
mongoose
    .connect(process.env.MONGO_URI, {
        useNewUrlParser: true,
        useUnifiedTopology: true,
    })
    .then(() => console.log('MongoDB connected!'))
    .catch((err) => console.log(err))

app.use('/api/world', worldRoutes)
app.use('/', baseRoutes)
const PORT = process.env.PORT || 3002

const server = https.createServer({ key, cert }, app);  
const wss = new WebSocket.Server({ server})
wss.on('connection', (ws, req) => {
    console.log('received socket connection ', req.headers['sec-websocket-key'])
...
})

server.listen(3002);
app.listen(PORT);

  console.log('Server is listening on port ' + PORT);

//not sure if needed
// server.on('upgrade', (request, socket, head) => {
//     wss.handleUpgrade(request, socket, head, (socket) => {
//         wss.emit('connection', socket, request)
//     })
// })
ghg1uchk

ghg1uchk1#

原来我没有在我的电话中使用https://,所以它没有被接起。一旦我使用正确的https://而不是http://,就可以了。

相关问题