Javascript WEB套接字的CORS验证
我正在使用expressjs并为所有来源添加cors验证Javascript WEB套接字的CORS验证,javascript,node.js,angular,express,cors,Javascript,Node.js,Angular,Express,Cors,我正在使用expressjs并为所有来源添加cors验证 const options = { origin: ['*'], credentials: true, exposedHeaders: false, preflightContinue: false, optionsSuccessStatus: 204, methods: ['GET', 'POST'], allowedHeaders: allowedHeaders, }; module.exports =
const options = {
origin: ['*'],
credentials: true,
exposedHeaders: false,
preflightContinue: false,
optionsSuccessStatus: 204,
methods: ['GET', 'POST'],
allowedHeaders: allowedHeaders,
};
module.exports = cors(options);
这将启用我正在使用的两个CORS请求中的一个,其中一个是来自服务器的响应,另一个是套接字
我用角度观测得到的结果,就像
const headers = {
// Host: '',
};
return this.http.get(`${environment.BASE_URL}:${_port}`,
{ headers, observe: 'response' });
}
非套接字的请求发送正确的响应。但是,带套接字的那个正在向我发送另一个对象
但如果我查看网络选项卡,我也会从套接字得到正确的响应
请参见下面的屏幕截图
(CORS无效)
(网络选项卡中的响应标头)
如果我在Firefox浏览器上打开CORSe扩展,则可以检索此标题
编辑:
我使用的不是Socket.io,而是一个Web套接字websocket=require('ws')代码>
回答:我的问题是一个逻辑错误
这并不能完全解决我的问题,因为我使用的是websocket而不是socket.io。然而,这让我意识到了我的问题,我分别收听了websocket和https,并且在我添加了在websocket中使用cors的选项后能够解决这个问题
// socket.js server config,for express
const app = express();
const server = app.listen(process.env.SOCKET_PORT, function () {
console.log("Server started: http://localhost:" + process.env.SOCKET_PORT + "/");
});
app.use(function (req, res, next) {
res.setHeader(
"Access-Control-Allow-Headers",
"X-Access-Token, Content-Type, Lang, crossDomain"
);
res.setHeader(
"Access-Control-Allow-Methods",
"POST, GET, OPTIONS, PUT, DELETE"
);
res.setHeader("Access-Control-Allow-Origin", "*");
req.headers.host = req.headers["x-forwarded-host"];
res.setHeader("Cache-Control", "no-cache");
//intercepts OPTIONS method
if ('OPTIONS' === req.method) {
//respond with 200
res.sendStatus(200);
} else {
//move on
next();
}
});
const io = require('socket.io')(server, {
transports: [
// 'polling',
"websocket"
],
allowUpgrades: true,
adapter: redisAdapter({host: 'localhost', port: process.env.REDIS_PORT || '6379'}),
pingInterval: 3000,
wsEngine: 'ws'
})
另外,我在nginx.conf中有配置
location / {
// important line
proxy_set_header 'Access-Control-Allow-Origin' '*';
proxy_set_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
# redirect all traffic to local port;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_redirect off;
proxy_read_timeout 86400;
# prevents 502 bad gateway error
proxy_buffers 8 32k;
proxy_buffer_size 64k;
reset_timedout_connection on;
//your port here
proxy_pass http://localhost:YOUR_PORT;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
添加cors:true到选项对象对我有效
const options = {
origin: ['*'],
cors:true,
credentials: true,
exposedHeaders: false,
preflightContinue: false,
optionsSuccessStatus: 204,
methods: ['GET', 'POST'],
allowedHeaders: allowedHeaders,
};
我已经试过这个方法了。这与我遇到的问题几乎相同,但这个解决方案对我不起作用。这并不是解决我问题的方法,因为我使用的是websocket而不是socket.io。然而,这让我意识到了我的问题,我分别收听了websocket和https,并且在我添加了在websocket中使用cors的选项后,就能够解决这个问题