如何使用Web套接字和angular CLI设置代理

Ben*_*ley 3 websocket node.js webpack-dev-server angular-cli angular

我有一个使用角度CLI构建的简单Web应用程序。我希望它使用Web套接字与后端通信。我已经编写了后端,并使用服务器可以在套接字上发送和接收的简单index.html页面进行了测试。

在我的angular-cli项目中,我设置了一个代理配置文件来设置到后端的代理。

proxy.conf.json

{
  "/sock": {
    "target": "http://localhost:3000",
    "changeOrigin": true,
    "ws": true,
    "logLevel": "debug"
  }
}
Run Code Online (Sandbox Code Playgroud)

然后使用以下命令启动服务器。

ng serve --proxy-config proxy.conf.json
Run Code Online (Sandbox Code Playgroud)

现在,我有一项服务,只是尝试打开一个套接字并发送一个固定的字符串,我希望该字符串被后端记录下来。

import { Injectable } from '@angular/core';
import * as io from 'socket.io-client';

@Injectable()
export class ChatService {

  private socket: any;

  constructor() {
    this.socket = io({ 'path': '/sock' });
    this.socket.emit('chat message', 'Hello World from browser!');
   }

}
Run Code Online (Sandbox Code Playgroud)

注意:无论是否使用url的/ sock部分,我都可以这样做。

我启动两个服务器。在浏览器中没有任何控制台错误。但是在有角CLI Web包服务器中,我收到以下消息。

10% building modules 2/2 modules 0 active[HPM] Proxy created: /sock  ->  http://localhost:3000
[HPM] Subscribed to http-proxy events:  [ 'error', 'close' ]

[HPM] GET /sockjs-node/530/z1z3teld/websocket -> http://localhost:3000
[HPM] Upgrading to WebSocket
[HPM] Error occurred while trying to proxy request /sockjs-node/530/z1z3teld/websocket from localhost:4200 to http://localhost:3000 (ECONNRESET) (https://nodejs.org/api/errors.html#errors_common_system_errors)
Run Code Online (Sandbox Code Playgroud)

是否支持Web套接字或我犯了一个愚蠢的错误?谢谢

Ben*_*ley 6

我设法通过反复试验弄清楚了这一点。我在控制台中查看了可在后端项目中使用的基本index.html页面。这个后端项目基本上是socket.io网站上的聊天服务器演示应用程序。我注意到,当打开Web套接字时,URL如下所示:

http://localhost:3000/socket.io/EIO=3&transport=websocket&sid=wTvdQTclHXJSUmAmAAAA
Run Code Online (Sandbox Code Playgroud)

因此,在有角度的CLI项目中,我修改了代理配置以包含/socket.io/部分,还添加了通配符。

{
  "/sock/*": {
    "target": "http://localhost:3000/socket.io/",
    "ws": true,
    "logLevel": "debug"
  }
}
Run Code Online (Sandbox Code Playgroud)

答对了!现在,在构建服务时,它将打开套接字并发出一条消息,我可以在后端看到该消息。

  • 这太神奇了,对于我来说,我使用的是 NestJS,默认实现需要我执行以下操作。```"/socket.io/*": { "target": "http://localhost:3333/socket.io", "ws": true }``` (2认同)