首页 > 解决方案 > 如何使用节点 js 将 socket.io 请求转换为 https?

问题描述

我有一个聊天应用程序,其中在节点 js 中实现了一个 socket.io,并且我的前端是有角度的。前面加载的是apache。现在我的套接字不能与 firefox 一起使用,所以为了解决这个问题,我需要处理来自后端而不是 apache 的 HTTPS 请求。下面是我将 HTTP 请求转换为 HTTPS 的后端代码。

var express = require('express');
var app = module.exports = express();
var https = require('https');
var fs = require('fs');
var server = https.createServer({
    key: fs.readFileSync("./ssl_config/privatekey.pem"),
    cert: fs.readFileSync("./ssl_config/cert.pem"),
    ca: fs.readFileSync("./ssl_config/fullchain.pem"),
    requestCert: true,
    rejectUnauthorized: false
},app);
server.listen(5000); //listen on port 5000
var client = require('socket.io').listen(server);

client.set('origins', "https://socket.eternalsoft.in");

client.set('transports', ['websocket',
    'flashsocket',
    'htmlfile',
    'xhr-polling',
    'jsonp-polling',
    'polling']);
console.log('Socket Started on Port: '+ socketPort);



client.on('connection', socket => {

    var addedUser = false;
    if(socket.handshake.query.token){
        console.log('connection established' , socket.handshake.query.token);
        cognitoExpress.validate(JSON.parse(socket.handshake.query.token) , (err, response) => {
            if(response){
                console.log(response , 'response');
            } else {
                console.log(err , 'err');
                socket.disconnect();
            }
        })
    } else {
        socket.disconnect();
    }
}

前端代码:

import * as io from 'socket.io-client';
export class ChatSocketService {
  public socketUrl = 'https://socket.eternalsoft.in:5000';
  token;
  socket;
  constructor() {

  }

  async connectSocket(){
    if (this.token) {
      this.socket = io(this.socketUrl, {
        forceNew: true,
        secure: true,
        reconnection: true,
        upgrade: false,
        reconnectionDelay: 3000,
        reconnectionDelayMax: 5000,
        reconnectionAttempts: Infinity,
        timeout : 10000,
        transports : ['websocket'],
        query: `token=` + this.token
      });
      this.socket.on('connect', () => {
        console.log('connection established');
      });
    }
  }
}

上面的代码不适用于 HTTPS 请求。在我们放置 APACHE 来处理 HTTPS 请求之前,但在删除套接字的 apache 之后,我无法从前端与后端套接字建立连接。谁能帮我解决这个问题?

标签: node.jsangularwebsocketsocket.io

解决方案


推荐阅读