node.js - 代理的 websocket 连接立即关闭

标签 node.js websocket create-react-app http-proxy-middleware

我有一个 create-react-app 开发服务器代理后端连接(就像一个那样)。突然 websocket 代理停止工作。

我的 setupProxy.js 看起来像这样:

const proxy = require('http-proxy-middleware');

module.exports = function(app) {
  const port = process.env.BACKEND_PORT || '8080';
  const target = `http://localhost:${port}`;
  app.use(proxy(['/path/to/socket'], {
    target,
    ws: true,
    onProxyReqWs: function(proxyReq, req, socket) {
      socket.on('error', err => console.log(err));
      console.log('socket is destroyed', socket.destroyed)
    },
    logLevel: 'debug',
  }));

  app.use(proxy(shouldProxy, {
    target,
    logLevel: 'debug',
  }));

(其中 shouldProxy 是一个函数,因为我的代理何时代理的逻辑......非常重要)。

当浏览器(Firefox 71或Chrome 79)创建websocket连接时,我可以看到后端收到请求并正常响应,但浏览器收到400 Bad请求,并且开发服务器控制台有以下内容:

[HPM] GET /path/to/socket -> http://localhost:8080
socket is destroyed true
[HPM] Upgrading to WebSocket
Error [ERR_STREAM_DESTROYED]: Cannot call write after a stream was destroyed
    at Socket.Writable.write (_stream_writable.js:321:17)
    at ClientRequest.<anonymous> ([...]/node_modules/http-proxy/lib/http-proxy/passes/ws-incoming.js:143:14)
    at ClientRequest.emit (events.js:305:20)
    at Socket.socketOnData (_http_client.js:508:11)
    at Socket.emit (events.js:305:20)
    at addChunk (_stream_readable.js:341:12)
    at readableAddChunk (_stream_readable.js:316:11)
    at Socket.Readable.push (_stream_readable.js:250:10)
    at TCP.onStreamRead (internal/stream_base_commons.js:186:23) {
  code: 'ERR_STREAM_DESTROYED'
}
[HPM] Client disconnected

所以某些东西似乎在代理过程的早期就破坏了套接字,但我无法理解是什么。

我目前使用 Node 13.5.0、http-proxy 1.18.0和http-proxy-middleware 0.20.0运行;我尝试将node降级到12.14.0,将HPM降级到0.19.1,但没有成功。

最佳答案

这是 an issue with create-react-app 3.3.0 ,由 this bug in webpack-dev-server 引起。将 "webpack-dev-server": "3.10.1" 添加到 package.jsonresolutions 部分并 SKIP_PREFLIGHT_CHECK=true .env 修复了它。

关于node.js - 代理的 websocket 连接立即关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59579433/

相关文章:

node.js - socket.io 判断用户是在线还是离线

webpack - monorepo 中的 create-react-app + gatsby 包不会同时运行

javascript - 创建 React 应用程序 : embed end-user plugin at runtime

sql-server - 如何从 SQL Server 传输 200 万行而不导致 Node 崩溃?

node.js - 如何使用 ExpressJS 将请求值传播到上下文?

node.js - 打开端口 3000 EC2 亚马逊网络服务

javascript - React-Intl 如何从变量切换语言环境和消息

javascript - 在继续下一项之前,如何在 for 循环中为一项运行函数?

javascript - Passportjs 如何返回验证结果而不是重定向到另一个页面

javascript - 在 cordova 项目中检查 native android 浏览器中的 WebSocket 支持