简体   繁体   English

如何在Socket.io中修复cors策略问题“它没有HTTP ok状态”

[英]How to fix cors policy problem “It does not have HTTP ok status” in Socket.io

I'm setting up socket.io server, and there is a problem with a cors policy . 我正在设置socket.io服务器,并且cors策略存在问题。 For example: If script uses a get request everything works, but while connecting to socket.io server this error shows on console 例如:如果脚本使用get请求一切正常,但在连接到socket.io服务器时,此错误会显示在控制台上

Access to XMLHttpRequest at ' https://ser.domain.xyz/iotCloud/?EIO=3&transport=polling&t=MdKfMsN ' from origin ' https://www.domain.xyz ' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status. 从原始' https://www.domain.xyz '访问' https://ser.domain.xyz/iotCloud/?EIO=3&transport=polling&t=MdKfMsN '的XMLHttpRequest已被CORS策略阻止:对预检请求的响应不通过访问控制检查:它没有HTTP ok状态。

I think it is problem with socket.io. 我认为这是socket.io的问题。 I tried everything but nothing worked. 我尝试了一切但没有任何效果。


var server = express();

var app = require('http').Server(server);

const io = new socket(app, {
  path   : "/iotCloud",
  origins: 'https://www.domain.xyz'
})

server.use(function(req, res, next){
  res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
  res.header('Access-Control-Allow-Headers', 'Access-Control-Allow-Origin,*');
  res.header('Access-Control-Allow-Credentials', true);
  res.header('Access-Control-Allow-Origin', 'https://www.projectann.xyz');
  next();
})

I also tried this instead of server.use 我也试过这个而不是server.use



var corsOptions = {
  origin: 'https://www.domain.xyz',
  credentials: true,
  methods: "GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS",
  preflightContinue: true,
  optionsSuccessStatus: 204,
}

server.use(cors(corsOptions))

Client - ServiceWorker 客户端 - ServiceWorker

importScripts('../cdn/js/socket.io.js');
var es = {};
     es.socket = io("https://ser.domain.xyz",{
        transportOptions: {
            polling: {
                extraHeaders: {
                    server: "AnnIoT",
                    "loginObject": JSON.stringify(m.data)
                  }
            }
        },
        secure: true,
        rejectUnauthorized: false,
        path: '/iotCloud'
      });


I searched everywhere stack,github and even other languages that saw this error. 我搜索了堆栈,github甚至其他看到此错误的语言。

an easy workaround is to add below code before next() 一个简单的解决方法是在next()之前添加下面的代码

if (req.method === 'OPTIONS') {
    res.status(200);
} 

so final code will look like 所以最终的代码看起来像

server.use(function(req, res, next){  
   res.header('Access-Control-Allow-Methods',
   'GET,PUT,POST,DELETE,OPTIONS');  
   res.header('Access-Control-Allow-Headers',
   'Access-Control-Allow-Origin,*');  
   res.header('Access-Control-Allow-Credentials', true);  
   res.header('Access-Control-Allow-Origin',
   'https://www.projectann.xyz');
if (req.method === 'OPTIONS') {
    res.status(200);
} next(); })

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

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