[英]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.