Ошибка углового прокси веб-сокета при обновлении до протокола веб-сокета - PullRequest
0 голосов
/ 21 мая 2018

Мое приложение для углового чата обслуживается через порт 4200, мой внутренний API (который обслуживает как REST, так и трафик веб-сокетов), работает на порту 3000.

Чтобы избежать путаницы с проблемами CORS, я проксирую все черезпорт 4200 и использование пути / API для всех моих вызовов API REST.Этот прокси REST API работает отлично.Проксирование через веб-сокет почти работает, но я почти уверен, что оно терпит неудачу при попытке «обновить» до WS, и после прочтения всего в Интернете и SO по этой теме я все еще застрял.

Я использую angular-cli и socket.io, запускаю мой API, работающий на порте 3000, а затем запускаю мое приложение с "ng serve --proxy-config proxy.conf.json" ( this SOсообщение очень помогло мне в начале) ...

Вот мой proxy.conf.json:

{
    "/api/*": {
      "target": "http://localhost:3000",
      "secure": false,
      "logLevel": "debug",
      "changeOrigin": true
    },
    "/sock/*": {
      "target": "http://localhost:3000/socket.io/",
      "secure": false,
      "logLevel": "debug",
      "ws": true,
      "changeOrigin": true
    }
}

Соответствующий код на стороне клиента находится в угловой службе, где я создаюодин веб-сокет в конструкторе для клиента для связи с серверной частью

const SERVER_URL = 'http://localhost:4200';

@Injectable()
export class WebSocketService {
    private socket;

    constructor() {
        console.log(`WebSocketService: initializing (URL ${SERVER_URL})`);
        this.socket = socketIo(SERVER_URL, {
            path: '/sock',
            autoConnect: true,
            transportOptions: {
              polling: {
                extraHeaders: {
                  'Authorization': 'Bearer abc'
                }
              }
            }
        });
    }
...
}

Вот что я делаю на стороне сервера

import * as socketIo from 'socket.io';

export default class WebSocketServer {
    private server: Server;
    private io: SocketIO.Server;

    constructor(server: Server) {
        this.server = server; 
        this.io = socketIo(this.server,{ 
          serveClient: false, 
          pingInterval: 10000, 
          pingTimeout: 5000, 
          cookie: false 
        });
        this.io.use((socket, next) => {
          let header = socket.handshake.headers['authorization'];
          console.log(`WebSocketServer: socket ${socket.id}, auth: ${header}`);
          if (true) {
            return next();
          }
          //return next(new Error('authentication error'));
        });
    }
...
}

Вот что происходит, когда я запускаю приложениена стороне клиента

enter image description here

На стороне сервера прокси на порт 3000 явно работает для длинной части опроса протокола websocket, но затемпосле того, как он пытается обновить, он терпит неудачу и фаВернемся к длинному опросу ... (Я думаю, что попытка обновления ниже приводит к сообщению об ошибке выше):

enter image description here

Я думаю, чтопроблема заключается в том, что сообщение «upgrade» в протоколе websocket не обрабатывается должным образом моей конфигурацией прокси, но я не совсем уверен.

1 Ответ

0 голосов
/ 13 июня 2018

Спасибо Марку-Кристиану, который выяснил, что происходит с переадресацией, которая работает неправильно.Я решил исправить это, выполнив 2 действия: 1) разделение трафика веб-сокета на другой порт (8080) и 2) изменение пути в socket.io и пути пересылки в proxy.conf.json на «mysock» (не уверен, что оба были необходимы).

...