我正在设置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甚至其他看到此错误的语言。
答案 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(); })