使用 Webpack 代理创建 React App 中的 WebSockets
WebSockets in Create React App with Webpack proxy
我使用版本 3.1.2(2019 年 9 月 19 日)中的 Create React App 创建了我的 React 应用程序。我试图为 Web Socket 请求配置代理,但似乎当我使用代理时,连接没有建立。我已经使用 THIS 示例来设置我的东西。服务器是示例中的 Asp.Net 核心,只要将地址连接到初始化中,它就可以工作。此代码段有效:
const hubConnection = new HubConnectionBuilder()
.withUrl("https://localhost:44392/chatHub")
.build();
而这不是:
const hubConnection = new HubConnectionBuilder()
.withUrl("chatHub")
.build();
有了这个:
{
"proxy": "https://localhost:44392/",
"name": "my-app",
"version": "0.1.0",
"private": true,
"dependencies": {
"@microsoft/signalr": "^3.0.0",
"react": "^16.9.0",
"react-dom": "^16.9.0",
"react-scripts": "3.1.2"
},
(...)
我看到有人建议 HERE 我可以在代理设置中使用一个对象,但是当我尝试时我得到一个错误,代理地址必须是一个字符串,而不是一个对象:
proxy: {
'^/api': {
target: '<url>',
ws: true,
changeOrigin: true
},
'^/foo': {
target: '<other_url>'
}
经过一番搜索,终于找到了解决办法https://create-react-app.dev/docs/proxying-api-requests-in-development/#configuring-the-proxy-manually
首先,安装http-proxy-middleware
。接下来,创建 src/setupProxy.js
并将以下内容放入其中:
const proxy = require('http-proxy-middleware');
module.exports = function(app) {
app.use(
'/api',
proxy({
target: '<url>',
ws: true,
changeOrigin: true
})
);
app.use(
'/foo',
proxy({
target: '<other_url>'
})
);
};
重新发布我在这里发布的解决方案:https://github.com/facebook/create-react-app/issues/5280
我遇到了无法将请求(开发中)代理到我自己的 websocket (socket-io) 服务器的问题。
我按照这里的步骤操作:create-react-app proxying requests in dev,我的 setupProxy.js
看起来像这样:
以下不适用于代理 websocket 连接:
const { createProxyMiddleware } = require('http-proxy-middleware');
module.exports = function (app) {
app.use(
'/api',
createProxyMiddleware({
target: 'http://localhost:5011',
}),
);
app.use(
'/socket-io',
createProxyMiddleware({
target: 'http://localhost:5011',
ws: true,
}),
);
};
但是,热重载不起作用,因为这会以某种方式干扰 webpack 开发服务器 websocket 连接。我会在控制台中看到此错误:
[HPM] Error occurred while trying to proxy request /sockjs-node from localhost:3000 to http://localhost:5011 (ECONNRESET) (https://nodejs.org/api/errors.html#errors_common_system_errors)
我通过执行以下操作使此工作正常进行:
const isDev = process.env.NODE_ENV === 'development';
const socket = isDev
? io.connect('http://localhost:5011', { path: '/socket-io' })
: io.connect({ path: '/socket-io' });
希望这对某人有所帮助!让我知道是否有更好的方法来做到这一点
对我来说,将 /api
下的特定路由代理为 websocket 路由不适用于之前建议的 src\setupProxy.js
配置。
但这行得通:
const { createProxyMiddleware } = require('http-proxy-middleware');
module.exports = function(app) {
app.use(
createProxyMiddleware('/api',{
target: 'http://localhost:9800',
changeOrigin: true,
})
);
app.use(
createProxyMiddleware('/api/notification/register', {
target: 'ws://localhost:9800',
ws: true,
changeOrigin: true,
})
);
};
这实际上产生了有意义的 HPM 输出:
[HPM] Proxy created: /api -> http://localhost:9800
[HPM] Proxy created: /api/notification/register -> ws://localhost:9800
我使用版本 3.1.2(2019 年 9 月 19 日)中的 Create React App 创建了我的 React 应用程序。我试图为 Web Socket 请求配置代理,但似乎当我使用代理时,连接没有建立。我已经使用 THIS 示例来设置我的东西。服务器是示例中的 Asp.Net 核心,只要将地址连接到初始化中,它就可以工作。此代码段有效:
const hubConnection = new HubConnectionBuilder()
.withUrl("https://localhost:44392/chatHub")
.build();
而这不是:
const hubConnection = new HubConnectionBuilder()
.withUrl("chatHub")
.build();
有了这个:
{
"proxy": "https://localhost:44392/",
"name": "my-app",
"version": "0.1.0",
"private": true,
"dependencies": {
"@microsoft/signalr": "^3.0.0",
"react": "^16.9.0",
"react-dom": "^16.9.0",
"react-scripts": "3.1.2"
},
(...)
我看到有人建议 HERE 我可以在代理设置中使用一个对象,但是当我尝试时我得到一个错误,代理地址必须是一个字符串,而不是一个对象:
proxy: {
'^/api': {
target: '<url>',
ws: true,
changeOrigin: true
},
'^/foo': {
target: '<other_url>'
}
经过一番搜索,终于找到了解决办法https://create-react-app.dev/docs/proxying-api-requests-in-development/#configuring-the-proxy-manually
首先,安装http-proxy-middleware
。接下来,创建 src/setupProxy.js
并将以下内容放入其中:
const proxy = require('http-proxy-middleware');
module.exports = function(app) {
app.use(
'/api',
proxy({
target: '<url>',
ws: true,
changeOrigin: true
})
);
app.use(
'/foo',
proxy({
target: '<other_url>'
})
);
};
重新发布我在这里发布的解决方案:https://github.com/facebook/create-react-app/issues/5280
我遇到了无法将请求(开发中)代理到我自己的 websocket (socket-io) 服务器的问题。
我按照这里的步骤操作:create-react-app proxying requests in dev,我的 setupProxy.js
看起来像这样:
以下不适用于代理 websocket 连接:
const { createProxyMiddleware } = require('http-proxy-middleware');
module.exports = function (app) {
app.use(
'/api',
createProxyMiddleware({
target: 'http://localhost:5011',
}),
);
app.use(
'/socket-io',
createProxyMiddleware({
target: 'http://localhost:5011',
ws: true,
}),
);
};
但是,热重载不起作用,因为这会以某种方式干扰 webpack 开发服务器 websocket 连接。我会在控制台中看到此错误:
[HPM] Error occurred while trying to proxy request /sockjs-node from localhost:3000 to http://localhost:5011 (ECONNRESET) (https://nodejs.org/api/errors.html#errors_common_system_errors)
我通过执行以下操作使此工作正常进行:
const isDev = process.env.NODE_ENV === 'development';
const socket = isDev
? io.connect('http://localhost:5011', { path: '/socket-io' })
: io.connect({ path: '/socket-io' });
希望这对某人有所帮助!让我知道是否有更好的方法来做到这一点
对我来说,将 /api
下的特定路由代理为 websocket 路由不适用于之前建议的 src\setupProxy.js
配置。
但这行得通:
const { createProxyMiddleware } = require('http-proxy-middleware');
module.exports = function(app) {
app.use(
createProxyMiddleware('/api',{
target: 'http://localhost:9800',
changeOrigin: true,
})
);
app.use(
createProxyMiddleware('/api/notification/register', {
target: 'ws://localhost:9800',
ws: true,
changeOrigin: true,
})
);
};
这实际上产生了有意义的 HPM 输出:
[HPM] Proxy created: /api -> http://localhost:9800
[HPM] Proxy created: /api/notification/register -> ws://localhost:9800