Node.js Socket.io+;nodejs=WebSocket握手期间出错:意外响应代码:500

Node.js Socket.io+;nodejs=WebSocket握手期间出错:意外响应代码:500,node.js,reactjs,websocket,socket.io,Node.js,Reactjs,Websocket,Socket.io,我一直在为我在Azure应用服务上托管的网站开发聊天功能。我正在使用端口443上的套接字,因为应用程序服务不允许80和443以外的任何其他端口。 套接字功能在本地主机上运行良好,但在部署时会显示此错误: js:122连接到'wss://mydomain/socket.io/?EIO=3&transport=websocket'失败:WebSocket握手期间出错:意外响应代码:500 这是我正在连接的客户端: const socket = io.connect("https://myd

我一直在为我在Azure应用服务上托管的网站开发聊天功能。我正在使用端口443上的套接字,因为应用程序服务不允许80和443以外的任何其他端口。 套接字功能在本地主机上运行良好,但在部署时会显示此错误:

js:122连接到'wss://mydomain/socket.io/?EIO=3&transport=websocket'失败:WebSocket握手期间出错:意外响应代码:500

这是我正在连接的客户端:

const socket = io.connect("https://mydomain:443", {transports: ['websocket'], secure: true, port: '443'});
这是我的server.js文件

const express = require("express");
const mongoose = require("mongoose");
const bodyParser = require("body-parser");
const passport = require("passport");
const users = require("./routes/api/users");
const base = require("./routes/api/base");
const leads = require("./routes/api/leads");
const requests = require("./routes/api/requests");
const offApp = require("./routes/api/offApp");
const chat = require("./routes/api/chat");
const chatSocket = require("./routes/socket/chat");
const path = require("path"); // on top
const app = express();
const cors = require('cors')
const https = require('https');
const fs = require('fs');

/**
 * App.
 */
const privateKey = fs.readFileSync('private.key').toString();
const certificate = fs.readFileSync('certificate.crt').toString();
const ca = fs.readFileSync('ca_bundle.crt').toString();

const server = https.createServer({key:privateKey,cert:certificate,ca:ca }, app);
const client = require('socket.io').listen(server);

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*"); // update to match the domain you will make the request from
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});

client.origins('*:*');
client.set('transports', ['websocket']);
server.listen(443);

// Bodyparser middleware
app.use(
  bodyParser.urlencoded({
    extended: false
  })
);
app.use(bodyParser.json());

// DB Config
const db = require("./config/keys").mongoURI;

// Connect to MongoDB
mongoose
  .connect(
    db,
    { useNewUrlParser: true }, (err, db) => {

      if (err) {
        throw err;
      }
      console.log('MongoDB connected');
      chatSocket(db, client);
    });

// Passport middleware
app.use(passport.initialize());

// Passport config
require("./config/passport")(passport);

// Routes
app.use("/api/users", users);
app.use("/api/base", base);
app.use("/api/leads", leads);
app.use("/api/requests", requests);
app.use("/api/offapp", offApp);
app.use("/api/chat", chat);

const port = process.env.PORT || 5000;

app.use(express.static("client/build")); // change this if your dir structure is different
app.get("*", (req, res) => {
  res.sendFile(path.resolve(__dirname, "client", "build", "index.html"));
});

app.listen(port, () => console.log(`Server up and running on port ${port} !`));

我在日志中没有发现任何错误

我可以使用默认端口解决此问题。(不是最好的解决方案,但对于Azure应用程序服务,我找不到任何其他解决方案)

对于客户端,我像这样连接到套接字

const socket = io.connect("https://example.com", {transports: ['websocket'], secure: true});
这就是我的服务器端的样子

const express = require("express");
const mongoose = require("mongoose");
const bodyParser = require("body-parser");
const passport = require("passport");
const users = require("./routes/api/users");
const base = require("./routes/api/base");
const leads = require("./routes/api/leads");
const requests = require("./routes/api/requests");
const offApp = require("./routes/api/offApp");
const chat = require("./routes/api/chat");
const chatSocket = require("./routes/socket/chat");
const path = require("path"); // on top
const app = express();
const cors = require('cors')
const https = require('https');
const fs = require('fs');

/**
 * App.
 */
var privateKey = fs.readFileSync('private.key').toString();
var certificate = fs.readFileSync('certificate.crt').toString();
var ca = fs.readFileSync('ca_bundle.crt').toString();

// var server = https.createServer({key:privateKey,cert:certificate,ca:ca }, app);
var server = require('http').createServer(app);
var client = require('socket.io').listen(server);

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*"); // update to match the domain you will make the request from
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});

client.origins('*:*');
client.set('transports', ['websocket']);

// Bodyparser middleware
app.use(
  bodyParser.urlencoded({
    extended: false
  })
);
app.use(bodyParser.json());

// DB Config
const db = require("./config/keys").mongoURI;
// Connect to MongoDB
mongoose
  .connect(
    db,
    { useNewUrlParser: true }, (err, db) => {

      if (err) {
        throw err;
      }
      console.log('MongoDB connected');
      chatSocket(db, client);
    });

// Passport middleware
app.use(passport.initialize());

// Passport config
require("./config/passport")(passport);

// Routes
app.use("/api/users", users);
app.use("/api/base", base);
app.use("/api/leads", leads);
app.use("/api/requests", requests);
app.use("/api/offapp", offApp);
app.use("/api/chat", chat);

const port = process.env.PORT || 5000;

app.use(express.static("client/build")); 
app.get("*", (req, res) => {
  res.sendFile(path.resolve(__dirname, "client", "build", "index.html"));
});

server.listen(port);

我能够通过使用默认端口解决这个问题。(不是最好的解决方案,但对于Azure应用程序服务,我找不到任何其他解决方案)

对于客户端,我像这样连接到套接字

const socket = io.connect("https://example.com", {transports: ['websocket'], secure: true});
这就是我的服务器端的样子

const express = require("express");
const mongoose = require("mongoose");
const bodyParser = require("body-parser");
const passport = require("passport");
const users = require("./routes/api/users");
const base = require("./routes/api/base");
const leads = require("./routes/api/leads");
const requests = require("./routes/api/requests");
const offApp = require("./routes/api/offApp");
const chat = require("./routes/api/chat");
const chatSocket = require("./routes/socket/chat");
const path = require("path"); // on top
const app = express();
const cors = require('cors')
const https = require('https');
const fs = require('fs');

/**
 * App.
 */
var privateKey = fs.readFileSync('private.key').toString();
var certificate = fs.readFileSync('certificate.crt').toString();
var ca = fs.readFileSync('ca_bundle.crt').toString();

// var server = https.createServer({key:privateKey,cert:certificate,ca:ca }, app);
var server = require('http').createServer(app);
var client = require('socket.io').listen(server);

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*"); // update to match the domain you will make the request from
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});

client.origins('*:*');
client.set('transports', ['websocket']);

// Bodyparser middleware
app.use(
  bodyParser.urlencoded({
    extended: false
  })
);
app.use(bodyParser.json());

// DB Config
const db = require("./config/keys").mongoURI;
// Connect to MongoDB
mongoose
  .connect(
    db,
    { useNewUrlParser: true }, (err, db) => {

      if (err) {
        throw err;
      }
      console.log('MongoDB connected');
      chatSocket(db, client);
    });

// Passport middleware
app.use(passport.initialize());

// Passport config
require("./config/passport")(passport);

// Routes
app.use("/api/users", users);
app.use("/api/base", base);
app.use("/api/leads", leads);
app.use("/api/requests", requests);
app.use("/api/offapp", offApp);
app.use("/api/chat", chat);

const port = process.env.PORT || 5000;

app.use(express.static("client/build")); 
app.get("*", (req, res) => {
  res.sendFile(path.resolve(__dirname, "client", "build", "index.html"));
});

server.listen(port);

你在哪里能解决这个问题?@ktm92是的,我能解决这个问题。首先要做的是永远不要使用Azure托管应用程序服务如果你想使用不同的端口,它会有一些限制。但是,如果您已经选择了应用程序服务,您可以尝试使用默认端口。我将把我的代码发布到线程中。你在哪里可以解决这个问题?@ktm92是的,我可以解决这个问题。首先要做的是永远不要使用Azure托管应用程序服务如果你想使用不同的端口,它会有一些限制。但是,如果您已经选择了应用程序服务,您可以尝试使用默认端口。我将把我的代码发布到线程中。