我正试图在我的socket.io-client反应应用程序中添加一个代理
我使用的是setupProxy.js和http-proxy-middleware,它适用于API,但不适用于套接字
具有节点js的服务器代码
var app = require('express')();
var http = require('http').createServer(app);
var io = require('socket.io')(http);
app.get('/', function (req, res) {
res.sendFile(__dirname + '/index.html');
});
io.on('connection', function (socket) {
setInterval(() => {
console.log('emit event');
io.emit('event', { data: 'worked successfully!' });
}, 1000);
});
http.listen(8080, function () {
console.log('listening on *:8080');
});客户端代码
function App() {
const socket = socketIOClient('/', {
transports: ['websocket'],
});
useEffect(() => {
socket.on('connect', () => {
console.log('connected');
});
socket.on('event', (data) => {
console.log(data);
});
}, []);
return (
<div className='App'>
Socket Proxy test
</div>
);
}还有我的setupProxy.js
const { createProxyMiddleware } = require('http-proxy-middleware');
module.exports = (app) => {
app.use(
'/socket.io',
createProxyMiddleware({
target: 'http://localhost:8080',
changeOrigin: true,
ws: true, // enable websocket proxy
logLevel: 'debug',
})
);
};发布于 2020-05-09 14:33:19
我通过在服务器和客户端套接字选项中添加自定义路径来解决这个问题。
{
path: '/socket',
}然后在代理中间件中使用该路径。
const socketProxy= createProxyMiddleware('/socket', {
target: 'http://localhost:8080',
changeOrigin: true,
ws: true,
logLevel: 'debug',
});
app.use(socketProxy);因此,最终的工作代码应该如下所示:
服务器代码:
var app = require('express')();
var http = require('http').createServer(app);
var io = require('socket.io')(http, {
path: '/socket', // added this line of code
});
app.get('/', function (req, res) {
res.sendFile(__dirname + '/index.html');
});
io.on('connection', function (socket) {
setInterval(() => {
console.log('emit event');
io.emit('event', { data: 'worked successfully!' });
}, 1000);
});
http.listen(8080, function () {
console.log('listening on *:8080');
});客户代码:
function App() {
const socket = socketIOClient('/', {
transports: ['websocket'],
path: '/socket', // added this line of code
});
useEffect(() => {
socket.on('connect', () => {
console.log('connected');
});
socket.on('event', (data) => {
console.log(data);
});
}, []);
return (
<div className='App'>
Socket Proxy test
</div>
);
}注释:命名空间应该添加到
<URL>param:const socket = socketIOClient('/namespace', {...})中
和最终的setupProxy.js
const { createProxyMiddleware } = require('http-proxy-middleware');
module.exports = (app) => {
const socketProxy= createProxyMiddleware('/socket', {
target: 'http://localhost:8080',
changeOrigin: true,
ws: true,
logLevel: 'debug',
});
app.use(socketProxy);
};发布于 2021-10-24 19:02:52
我通过以下步骤解决了这个问题:
使用http protocol.创建
前部:
import io from 'socket.io-client';
const socket = io({
protocols: ["http"],
});setupProxy.js.中
module.exports = function (app) {
app.use(
createProxyMiddleware("/socket.io",{
target: 'http://localhost:8001',
changeOrigin: true,
ws: false,
})
);
};Note
socket.io-client's默认端点是/socket.io.socket.io-client's默认协议是ws://,这不会触发defulat.的代理规则。
https://stackoverflow.com/questions/61646928
复制相似问题