Socket.io否请求的资源上存在“Access-Control-Allow-Origin”标题。 Origin'http:// localhost'因此不被允许访问

我想用socket.io学习nodejs,目前我正在使用GianlucaGuarini的这个教程 。 当input我的client.html文件,我得到以下错误。 我知道这是什么意思,它是为了防止跨浏览器脚本,但我不知道如何让我的nodejs脚本访问client.html文件。

XMLHttpRequest cannot load http://localhost:8000/socket.io/?EIO=3&transport=polling&t=1422653081432-10. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not allowed access. 

这是我的代码与套接字的一部分。

  var app = require('http').createServer(handler), io = require('socket.io').listen(app), fs = require('fs'), mysql = require('mysql'), connectionsArray = [], connection = mysql.createConnection({ host: 'localhost', user: 'root', password: '', database: 'database', port: 3306 }), POLLING_INTERVAL = 3000, pollingTimer; // If there is an error connecting to the database connection.connect(function(err) { // connected! (unless `err` is set) console.log(err); }); // creating the server ( localhost:8000 ) app.listen(8000); // on server started we can load our client.html page function handler(req, res) { res.writeHead(200, { /// ... 'Access-Control-Allow-Origin' : '*' }); fs.readFile(__dirname + '/client.html', function(err, data) { if (err) { console.log(err); res.writeHead(500); return res.end('Error loading client.html'); } res.writeHead(200); res.end(data); }); } 

有谁知道我可以如何解决我的问题?

亲切的态度/ H

首先 – 停止使用writeHead无处不在。 因为它重写了完整的响应标题。

如果旅游这样写:

 res.writeHead(200,{"coolHeader":"YesIAm"}); res.writeHead(500); 

那么node.js将只发送状态为500的响应,并且没有标题“coolHeader”;

如果您想更改状态码,请使用

 res.statusCode = ###; 

如果你想添加新的头使用

 res.setHeader("key", "value"); 

如果你想重写所有的头然后使用writeHeader(...)

第二。 添加此代码

 res.statusCode = 200; //... res.setHeader("Access-Control-Allow-Origin", "*"); res.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); 

而不是你的

  res.writeHead(200, { /// ... 'Access-Control-Allow-Origin' : '*' }); 

并用res.statusCode = ###;replace所有writeHead(###) res.statusCode = ###;

尝试在Node中的响应对象上设置“Access-Control-Allow-Origin”标头。

 response.writeHead(200, { /// ... 'Access-Control-Allow-Origin' : '*' }); 

看起来你打电话.listen为应用程序和socket.io(我相信这是多余的,因为你是扩展你的服务器与socket.io)

我有一个小小的部分,使用socket.io 1.x我工作得很好我喜欢使用https,因为它杀死了防火墙和防病毒的一些问题,但是这个例子被重写为http。

 var http = require('http'), socketio = require('socket.io'), options={}, port=8080; //start http var app = http.createServer(options, handler), io = socketio(app, { log: false, agent: false, origins: '*:*' // 'transports': ['websocket', 'htmlfile', 'xhr-polling', 'jsonp-polling'] }); app.listen(port); console.log('listening on port ' + port);