You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
注册

Webpack Dev Server的WebSocket代理失效,配置问题排查求助

问题分析与修复方案

咱们先从你抛出的错误说起:WebSocket connection to 'ws://api2/someSocket' failed: Error in connection establishment: net::ERR_NAME_NOT_RESOLVED —— 这个错误本质是api2这个域名浏览器找不到,说明你前端代码里的WebSocket请求地址写错了,应该指向webpack-dev-server的地址(比如ws://localhost:3000/someSocket),而不是莫名其妙的api2

再看你的devServer proxy配置,还有俩关键问题:

1. WebSocket代理的path配置完全错了

webpack-dev-server的proxy里,path是用来匹配请求URL的路径部分的,不是写协议的。你写path: 'ws://'完全不符合规则,proxy根本识别不了这是要转发WebSocket请求。

2. 没正确区分WebSocket和HTTP请求的转发规则

你需要明确告诉proxy,哪些请求要走WebSocket转发,哪些走HTTP。


给你俩修正后的配置方案,选一个用就行

方案一:精准区分WebSocket和HTTP请求

这种方式更清晰,不会混淆两种请求:

devServer: {
    contentBase: path.join(__dirname, 'dist'),
    port: 3000,
    hot: false,
    inline: false,
    historyApiFallback: true,
    proxy: [
        {
            // 专门匹配WebSocket请求:通过请求头的upgrade字段判断
            context: (pathname, req) => req.headers.upgrade === 'websocket',
            target: 'ws://localhost:9000',
            ws: true,
            secure: false,
        },
        {
            // 剩下的都是HTTP请求
            context: (pathname, req) => req.headers.upgrade !== 'websocket',
            target: 'http://localhost:9000',
            secure: false,
            changeOrigin: true,
        },
    ]
}

方案二:简洁版,自动处理WebSocket

如果你的所有请求(包括WebSocket)都要转发到同一个后端,直接开启ws: true就行,webpack会自动识别WebSocket请求:

devServer: {
    contentBase: path.join(__dirname, 'dist'),
    port: 3000,
    hot: false,
    inline: false,
    historyApiFallback: true,
    proxy: {
        '/': {
            target: 'http://localhost:9000',
            secure: false,
            changeOrigin: true,
            ws: true, // 开启这个,自动处理WebSocket的upgrade请求
        }
    }
}

最后别忘了改前端的请求地址

把你前端代码里的WebSocket请求改成指向devServer的端口,比如:

// 要么写完整地址
const socket = new WebSocket('ws://localhost:3000/someSocket');
// 要么用相对路径(推荐,部署时不用改)
const socket = new WebSocket('/someSocket');

这样请求会被devServer捕获,然后通过proxy转发到后端的9000端口的WebSocket服务,就不会再出现域名解析失败的问题了。

内容的提问来源于stack exchange,提问作者user3712353

火山引擎 最新活动