Мое приложение для углового чата обслуживается через порт 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'));
});
}
...
}
Вот что происходит, когда я запускаю приложениена стороне клиента
На стороне сервера прокси на порт 3000 явно работает для длинной части опроса протокола websocket, но затемпосле того, как он пытается обновить, он терпит неудачу и фаВернемся к длинному опросу ... (Я думаю, что попытка обновления ниже приводит к сообщению об ошибке выше):
Я думаю, чтопроблема заключается в том, что сообщение «upgrade» в протоколе websocket не обрабатывается должным образом моей конфигурацией прокси, но я не совсем уверен.