node.js - socket.io/ 用 firefox 表示“跨域请求被阻止”,在 chrome 中表示“ERR_CONNECTION_REFUSED”
问题描述
我正在使用 socket.io 和 express 来制作一个多用户应用程序。它工作得很好,直到我想把它变成多个实例,一个托管登录页面,一个单独的运行每个节点项目。
火狐错误
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:5002/socket.io/?EIO=3&transport=polling&t=N3Xwg8R. (Reason: CORS request did not succeed).
铬错误
GET http://localhost:5002/socket.io/?EIO=3&transport=polling&t=N3XwwIP net::ERR_CONNECTION_REFUSED
服务器
var express = require('express'),
app = express(),
server = require('http').createServer(app),
io = require('socket.io').listen(server),
path = require('path');
app.use(express.static(path.join(__dirname,"public/multiplayerdrawing")));
server.listen(5002);
客户
socket = io('http://localhost:5002')
socket.connect()
socket.on('connect', () => {
console.log("connected");
})
现在是有趣的部分。我试过的。主要来自 24058157 个答案。
var io = require('socket.io')(server, { origins: '*:*'});
不
io.origins('*:*')
不
io.set('origins', '*:*');
不
io.set('origins', 'http://mydomain.xyz:5002');
不
const io = require("socket.io")(server, {
handlePreflightRequest: (req, res) => {
const headers = {
"Access-Control-Allow-Headers": "Content-Type, Authorization",
"Access-Control-Allow-Origin": req.headers.origin, //or the specific origin you want to give access to,
"Access-Control-Allow-Credentials": true
};
res.writeHead(200, headers);
res.end();
}
});
不
const cors = require('cors');
app.use(cors());
仍然没有。
app.use(function(req, res, next) {
res.header('Access-Control-Allow-Origin', req.get('Origin') || '*');
res.header('Access-Control-Allow-Credentials', 'true');
res.header('Access-Control-Allow-Methods', 'GET,HEAD,PUT,PATCH,POST,DELETE');
res.header('Access-Control-Expose-Headers', 'Content-Length');
res.header('Access-Control-Allow-Headers', 'Accept, Authorization, Content-Type, X-Requested-With, Range');
if (req.method === 'OPTIONS') {
return res.send(200);
} else {
return next();
}
});
可能用错了这个,但我不明白。
也许这是我的 nginx 配置
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name mysite.xyz www.mysite.xyz;
location ^~ / {
proxy_pass http://localhost:5000;
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;
}
location /multiplayerdrawing {
rewrite ^/multiplayerdrawing/(.*) /$1 break;
proxy_pass http://localhost:5002/multiplayerdrawing; #whatever port your app runs on
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;
}
解决方案
推荐阅读
- php - 基于 laravel 路由参数的中间件
- flutter - Why is FutureBuilder called multiple times?
- r - 在 R 中使用 diff 和 cumsum
- angular - Angular Component Dynamic Compile - ng-content with select 不起作用
- curl - 在 Terraform 数据中保存 JS 文件的 Curl 产生 JSON 错误
- java - 如何在不破坏叠加层的合法使用的情况下防止 Android 中的窃听?
- javascript - 如何确定 React.useCallback 的依赖列表?
- c - 我想在C中将一个字符串分成两个字符串
- java - 将 cookie 与 spring 集成
- python - 在 Python 中加入列表的一些元素