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

时间:2019-03-31 16:57:43

标签: javascript node.js socket.io cors

我正在设置socket.io服务器,并且cors策略存在问题。例如:如果脚本使用get请求,则一切正常,但是在连接到socket.io服务器时,此错误将显示在控制台上

  

从原点“ https://ser.domain.xyz/iotCloud/?EIO=3&transport=polling&t=MdKfMsN”到“ https://www.domain.xyz”的XMLHttpRequest的访问已被CORS策略阻止:对预检请求的响应未通过访问控制检查:它没有HTTP正常状态。

我认为socket.io存在问题。我尝试了一切,但没有任何效果。


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();
})

我也尝试使用此方法代替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))

客户端-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'
      });


我搜索了无处不在的堆栈,github甚至其他看到此错误的语言。

1 个答案:

答案 0 :(得分:0)

一个简单的解决方法是在next()之前添加以下代码

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

因此最终代码将类似于

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(); })