Javascript Nodejs-Express-我无法连接到Socket IO对象会有什么问题?

Javascript Nodejs-Express-我无法连接到Socket IO对象会有什么问题?,javascript,node.js,express,sockets,socket.io,Javascript,Node.js,Express,Sockets,Socket.io,我只在远程服务器端面临一个问题,这意味着即使通过https自签名证书,本地也可以正常工作。但当我将代码移动到服务器中时,它也可以在本地工作,但不能在远程工作 我已经创建了一个节点应用程序,该应用程序位于服务器的https端口3000下。此应用程序具有套接字IO库,我已将其连接到同一https服务器。我没有使用nodeiis,因为我使用重写规则将其传递给Windows IIS 我已经在IIS中安装了websocket模块。事实上,我已经用websockets代替了Socket.IO,它与我现在使用

我只在远程服务器端面临一个问题,这意味着即使通过https自签名证书,本地也可以正常工作。但当我将代码移动到服务器中时,它也可以在本地工作,但不能在远程工作

我已经创建了一个节点应用程序,该应用程序位于服务器的https端口3000下。此应用程序具有套接字IO库,我已将其连接到同一https服务器。我没有使用nodeiis,因为我使用重写规则将其传递给Windows IIS

我已经在IIS中安装了websocket模块。事实上,我已经用websockets代替了Socket.IO,它与我现在使用的配置一样工作正常,我只是用Socket.IO替换了它,因为它更适合我的需要

现在我的代码

Html页面

<script src="/socket.io/socket.io.js"></script>
<script src="/js/Client.js"></script>
App.js

....
const https = require('https');

var socketlib = require('./socketLib');
const fs = require('fs');
const app = express();
var cookieParser = require('cookie-parser');
app.use(sessionParser);
var expiryDate = new Date( Date.now() + 60 * 60 * 1000 );

const sessionParser = session({
  secret: 'secret', resave: true, cookieName: 'sessionName',
  name: 'sessionId', saveUninitialized: true,
  ephemeral: true,
  cookie: { secure: true, expires: expiryDate, SameSite : 'None',
    maxAge: 24000 * 60 * 60, // One hour
  }
});

//// HTTPS Server ////
const options = {
  key: fs.readFileSync(config.certKey),
  cert: fs.readFileSync(config.certCert)
};

var httpsServer = https.createServer(options, app, function (req, res) {
    console.log('request starting...https');
});

httpsServer.listen(3000, function(req, res) {
  console.log('Server is running at', config.nodeApiUrl + ':', port)
});

socketlib(httpsServer, sessionParser);

app.all('/*', function (req, res, next) {
res.header('Access-Control-Allow-Origin', 'https://localhost:3000') 
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE')
res.header("Access-Control-Allow-Credentials", "true");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, X-Access-Token,X-Key");
    return next();
})

socketLib.js

module.exports = async function(httpsServer, sessionParser) {
    var io = require("socket.io")(httpsServer);

    io.use(function(socket, next) {
        sessionParser(socket.request, socket.request.res, next);
    });

    io.use((socket, next) => {
        if (socket.request.headers.cookie)
            return next();
        next(new Error('Authentication error'));
    });

    io.sockets.on('connection', function(socket) {
        console.log(`New connection from: ${socket.handshake.address}`)
    });
}
iis网络配置

<rule name="Websocket" stopProcessing="true" enabled="true">
      <match url="socket.io" ignoreCase="true" />
      <action type="Rewrite" url="https://localhost:3000/{R:0}/socket.io.js" appendQueryString="false" redirectType="Found" />
        <conditions>
           <add input="{HTTP_HOST}" pattern="domainxxx.com" />
        </conditions>
    </rule> 
您将看到:

var e=new Error("server error")
最后,基本上,当我试图通过domainxxx.com访问时,就像发生了一些事情,套接字无法远程连接,本地工作正常,所以我想唯一的问题是在重写规则之后,因为我可以看到,重写规则是100%正确的,但显然我遗漏了一些东西

我希望你能帮助我!我做了很多研究,却找不到治疗的方法


提前谢谢你

多亏了一篇4年的帖子,我才能够解决这个问题。问题在于重写规则。我只是用下面的代码替换了它,它就像一个符咒

        <rule name="WebSocketTestRule" stopProcessing="true">
            <match url=".*" />
            <conditions>
                <add input="{CACHE_URL}" pattern="domainxxx.com" />
            </conditions>
            <action type="Rewrite" url="https://localhost:3000/{R:0}" />
        </rule> 


如果它不能远程工作,并且这是一个托管服务器,那么可能需要修复托管配置中的某些内容(代理、负载平衡器等),以正确允许持久的webSocket连接。下面是一个相关问题,并感谢@jfriend00发表的这些帖子。如果运气好的话,我可以把它修好。这个问题与重写规则有关!再次感谢你!如果你愿意,你可以为自己的问题写一个答案,说明你遗漏了什么。我不太懂,写不出答案。我只是写了。谢谢
switch(a('socket receive: type "%s", data "%s"',t.type,t.data),this.emit("packet",t),this.emit("heartbeat"),t.type){case"open":this.onHandshake(JSON.parse(t.data));break;case"pong":this.setPing(),this.emit("pong");break;case"error":var e=new Error("server error");e.code=t.data,this.onError(e);break;
var e=new Error("server error")
        <rule name="WebSocketTestRule" stopProcessing="true">
            <match url=".*" />
            <conditions>
                <add input="{CACHE_URL}" pattern="domainxxx.com" />
            </conditions>
            <action type="Rewrite" url="https://localhost:3000/{R:0}" />
        </rule>