我最近开始学习node.js和socket.io。我遵循了socket.io的一个简单教程,它在我的电脑上运行时一切正常。然而,我决定将客户端上传到服务器进行测试,这就是问题的开始。我想在web主机上运行聊天客户端,在我的计算机或其他主机上运行服务器。基本上,我计划对服务器进行端口转发,并让客户机在网页上运行。我打开我的端口到端口转发,它似乎是工作的,但是我每次都在网页上得到错误。
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://24.151.51.34:3000/socket.io/?EIO=3&transport=polling&t=1437399007343-0. (Reason: CORS request failed).
我一直在弄乱代码,希望在开始自己的项目之前找到这个问题的解决方案,但是我想不出一种方法。客户端代码为:
<!doctype html>
<html>
<head>
<title>Socket.IO chat</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body { font: 13px Helvetica, Arial; }
form { background: #000; padding: 3px; position: fixed; bottom: 0; width: 100%; }
form input { border: 0; padding: 10px; width: 90%; margin-right: .5%; }
form button { width: 9%; background: rgb(130, 224, 255); border: none; padding: 10px; }
#messages { list-style-type: none; margin: 0; padding: 0; }
#messages li { padding: 5px 10px; }
#messages li:nth-child(odd) { background: #eee; }
</style>
</head>
<body>
<ul id="messages"></ul>
<form action="">
<input id="m" autocomplete="off" /><button>Send</button>
</form>
<script src="https://cdn.socket.io/socket.io-1.2.0.js"></script>
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>
<script>
var socket = io('24.151.51.34:3000');
$('form').submit(function(){
socket.emit('chat message', $('#m').val());
$('#m').val('');
return false;
});
socket.on('chat message', function(msg){
$('#messages').append($('<li>').text(msg));
});
</script>
</body>
</html>
对于服务器代码,我尝试添加代码以允许 CORS,但真的不确定该怎么做:
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
io.set('origins', 'http://browsercombat.com:80');
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
res.header("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE, OPTIONS");
res.header("Access-Control-Allow-Credentials", "true");
next();
});
app.get('/', function(req, res, next) {
res.sendFile(__dirname + '/index.html');
});
app.post('/', function(req, res, next) {
// Handle the post for this route
});
io.on('connection', function(socket){
socket.on('chat message', function(msg){
io.emit('chat message', msg);
});
});
http.listen(3000, function(){
console.log('listening on *:3000');
});
我现在使用npm cors包,它的工作就像一个魅力没有问题socket.io太。
像这样添加它.选项('*', cors());
这意味着访问控制允许来源:“*”
var express = require('express');
var app = express();
var http = require('http').Server(app);
const cors = require('cors');
var bodyParser = require('body-parser');
app.use(cors());
app.options('*', cors());
const auth = require('./routes/auth');
const port = 3004;
http.listen(port, () => {
console.log( `running http at port ${port}`);
});
我设法解决了这个问题,通过使用这个有人推荐给我的CORS中间件,并检查我的防火墙设置。https://www.npmjs.com/package/cors
除了使用cors包,我还通过在socketio创建中添加选项来修复它。从版本3开始,cors配置发生了变化,您必须添加这些选项。也在socket版本2.x.x上工作过。
const io = socketio(httpServer, {
cors: {
origin: "http://localhost:3000",
methods: ["GET", "POST"],
credentials: true
}
});
这是资源https://socket.io/docs/v3/handling-cors/
奖励:如果你遇到坏请求,请确保你有相同版本的套接字。io用于客户端和服务器。
问题内容: 我一直在学习redis和node.js。我有两个问题,找不到令人满意的答案。 我的第一个问题是关于在node.js中重用Redis客户端。我找到了这个问题和答案:如何在socket.io中重用Redis连接,但还不足以让我满意。 现在,如果我在连接事件中创建redis客户端,它将为每个连接生成。因此,如果我有2万个并发用户,那么将有2万个Redis客户端。 如果我将其放在连接事件之外,
我正在使用CloudFlare实现一个REST API。我需要添加一些在node.js上用socket.io实现的通知。当socket.io使用活动连接来保持客户机更新时,它将工作,因为连接是在服务器-客户机之间建立的,但是当socket.io进行轮询时会发生什么呢?CloudFlare是否总是为每个客户机使用相同的服务器?
问题内容: 我正在使用快速框架。我想从socket.io访问会话数据。我尝试使用client.listener.server.dynamicViewHelpers数据来表达dynamicHelpers,但无法获取会话数据。有没有简单的方法可以做到这一点?请看代码 问题答案: 这不适用于通过flashsocket传输的套接字(它不会向服务器发送所需的cookie),但可以可靠地用于其他所有事务。我只
问题内容: 关于它们有很多传说。我想知道真相。以下两个示例之间有什么区别? 问题答案: 不确定从何处获得传说,但: 提交按钮 与: IE6将在标记之间提交此按钮的所有文本,其他浏览器将仅提交值。使用可使您在按钮的设计上享有更大的布局自由度。从各种意图和目的看,它乍一看似乎很棒,但是各种浏览器怪癖使它有时很难使用。 在您的示例中,IE6将发送到服务器,而其他大多数浏览器将不发送任何内容。要使其跨浏览
什么区别以及如何正确重写代码?
问题内容: 我希望让Socket.io 在Node.js v.0.6.0及更高版本中与本机负载平衡(“集群”)一起工作。 据我了解,Socket.io使用Redis存储其内部数据。我的理解是:不是要为每个工作人员生成一个新的Redis实例,而是要强制这些工作人员使用与主服务器相同的Redis实例。因此,连接数据将在所有工作人员之间共享。 像这样的主人: 我们必须以某种方式传递给工人并执行以下操作: