使用 socket.io / nginx / node 时出现 CORS 错误

Posted

技术标签:

【中文标题】使用 socket.io / nginx / node 时出现 CORS 错误【英文标题】:Getting CORS error while using socket.io / nginx / node 【发布时间】:2017-11-30 22:32:33 【问题描述】:

我正在从 chrome 的控制台获取此错误日志

XMLHttpRequest 无法加载 https://subgroup.domain.com/socket.io/?EIO=3&transport=polling&t=Lpgp_mu。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,Origin 'http://localhost:3000' 不允许访问。响应的 HTTP 状态代码为 500。

我正在使用 Node.js、socket.io 在我的节点和 react.js 之间进行通信,并使用 digitalocean 的 droplet 使用 nginx 来托管它们。

我已经阅读了很多关于 CORS 错误的信息,但我不确定在哪里修复该错误。我一直试图让它们进入我的 NGINX

location /server  
    proxy_pass http://localhost:8080;
    proxy_http_version 1.1;
    proxy_set_header Access-Control-Allow-Origin *;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;

从我的 node.js,服务器端:

var express = require("express");
var app = express();
var http = require("http");
var port = 8080;
var io = require("socket.io").listen(app.listen(port));

app.use("/", function (req, res, next) 
    res.status(200).send("Online   |" + "   Version : [" + AppVersion + "]");
    res.setHeader("Access-Control-Allow-Origin","*");
    res.setHeader("Access-Control-Allow-Headers","X-Requested-With,content-type");
    res.setHeader("Access-Control-Allow-Methods","GET,POST, OPTIONS, PUT, PATCH, DELETE");
    next(););

我在客户端连接使用:

const socket = io.connect("https://subgroup.domain.com/server")

我不太确定我应该在哪里寻找什么。任何形式的帮助都会有所帮助。谢谢!

【问题讨论】:

遇到同样的问题。请问你找到解决办法了吗? @DipinKrishnan 对于迟到的答案我感到非常抱歉!但是,是的,我通过指定一个 URL 而不是 wildstar * 找到了一个。例如res.setHeader('Access-Control-Allow-Origin', 'subdomain.domain.com'); 【参考方案1】:

经过长时间的研究和执行多次测试,我得到了这个工作。这是我所做的,

NodeJS

const server = require('http').createServer();
const io = require('socket.io')(server);

io.on('connection', (socket) => 
  console.log('A user connected!');
  io.emit('welcome', 'Hello there!');
);

server.listen(3001);
console.log('Socket server started on port 3001');

Nginx

upstream websocket1 
    server 127.0.0.1:3001;


server 

    listen 80;
    listen [::]:80;

    root /var/www/html;

    server_name mydomain.com

    location /ws/ 
        proxy_pass http://websocket1/socket.io/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    

终于在客户端

const socket = io.connect('http://yourdomain.com/', path: '/ws/')

这是来自 Chrome 控制台的屏幕截图。

在Nginx中指定location后,请不要忽略/,它必须是/ws/否则不起作用。目前我已经使用 Nginx 将节点平衡器添加到此套接字服务中。

干杯!

【讨论】:

我的代码相同,但客户端抛出错误 CORS。 @cuongdevjs for socket.io v3 使用这个方法socket.io/docs/v3/handling-cors

以上是关于使用 socket.io / nginx / node 时出现 CORS 错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 Socket.IO 的 NGINX 配置

使用 socket.io / nginx / node 时出现 CORS 错误

使用 Nginx 的 socket.io 出现 CORS 错误

Socket.io + Nginx + AWS Application Load Balancer 连接在建立之前关闭

Nginx 在 /socket.io 请求上返回 400

Nginx + Node.js + Socket.io + SSL 可能吗?