繁体   English   中英

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

[英]Getting CORS error while using socket.io / nginx / node

我从 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 之间进行通信,使用 nginx 托管它们的 digitalocean 的 droplet。

我已经阅读了很多关于 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")

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

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

节点

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 的套接字服务中。

干杯!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM