首页 > 解决方案 > socket.io/ 用 firefox 表示“跨域请求被阻止”,在 chrome 中表示“ERR_CONNECTION_REFUSED”

问题描述

我正在使用 socket.io 和 express 来制作一个多用户应用程序。它工作得很好,直到我想把它变成多个实例,一个托管登录页面,一个单独的运行每个节点项目。

火狐错误

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:5002/socket.io/?EIO=3&transport=polling&t=N3Xwg8R. (Reason: CORS request did not succeed).

铬错误

GET http://localhost:5002/socket.io/?EIO=3&transport=polling&t=N3XwwIP net::ERR_CONNECTION_REFUSED

服务器

var express = require('express'),
    app = express(), 
    server = require('http').createServer(app),
    io = require('socket.io').listen(server),
    path = require('path');

app.use(express.static(path.join(__dirname,"public/multiplayerdrawing")));
server.listen(5002);

客户

socket = io('http://localhost:5002')
socket.connect()

socket.on('connect', () => {
  console.log("connected");
})

现在是有趣的部分。我试过的。主要来自 24058157 个答案。

var io = require('socket.io')(server, { origins: '*:*'});

io.origins('*:*')

io.set('origins', '*:*');

io.set('origins', 'http://mydomain.xyz:5002');

const io = require("socket.io")(server, {
    handlePreflightRequest: (req, res) => {
        const headers = {
            "Access-Control-Allow-Headers": "Content-Type, Authorization",
            "Access-Control-Allow-Origin": req.headers.origin, //or the specific origin you want to give access to,
            "Access-Control-Allow-Credentials": true
        };
        res.writeHead(200, headers);
        res.end();
    }
});

const cors = require('cors');
app.use(cors());

仍然没有。

app.use(function(req, res, next) {
  res.header('Access-Control-Allow-Origin', req.get('Origin') || '*');
  res.header('Access-Control-Allow-Credentials', 'true');
  res.header('Access-Control-Allow-Methods', 'GET,HEAD,PUT,PATCH,POST,DELETE');
  res.header('Access-Control-Expose-Headers', 'Content-Length');
  res.header('Access-Control-Allow-Headers', 'Accept, Authorization, Content-Type, X-Requested-With, Range');
  if (req.method === 'OPTIONS') {
    return res.send(200);
  } else {
    return next();
  }
});

可能用错了这个,但我不明白。

也许这是我的 nginx 配置


server {
    listen 80 default_server;
    listen [::]:80 default_server;
    root /var/www/html;
    index index.html index.htm index.nginx-debian.html;
    server_name mysite.xyz  www.mysite.xyz;

    location ^~ / {
        proxy_pass http://localhost:5000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
location /multiplayerdrawing {
    rewrite ^/multiplayerdrawing/(.*) /$1 break;
        proxy_pass http://localhost:5002/multiplayerdrawing; #whatever port your app runs on
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }

标签: node.jsexpresssocket.io

解决方案


推荐阅读