Socket.io 请求的资源上不存在 'Access-Control-Allow-Origin' header。因此不允许来源 'http://localhost' 访问
Socket.io No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not allowed access
我正在尝试使用 socket.io 学习 nodejs,目前我正在使用 this tutorial by GianlucaGuarini。输入 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
尝试在您的响应 object 中设置 `Access-Control-Allow-Origin' header。
response.writeHead(200, {
/// ...
'Access-Control-Allow-Origin' : '*'
});
首先 - 停止在任何地方使用 writeHead。因为它完全重写了响应 headers.
如果旅游这样写:
res.writeHead(200,{"coolHeader":"YesIAm"});
res.writeHead(500);
然后 node.js 将仅发送状态为 500 且没有 header 的响应 "coolHeader";
如果您想更改状态代码,请使用
res.statusCode = ###;
如果你想添加新的 header 使用
res.setHeader("key", "value");
如果你想重写所有 header 则使用 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' : '*'
});
并将所有 writeHead(###)
替换为 res.statusCode = ###;
看起来你正在为应用程序和 socket.io 调用 .listen(我认为这是多余的,因为你正在使用 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);
我正在尝试使用 socket.io 学习 nodejs,目前我正在使用 this tutorial by GianlucaGuarini。输入 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
尝试在您的响应 object 中设置 `Access-Control-Allow-Origin' header。
response.writeHead(200, {
/// ...
'Access-Control-Allow-Origin' : '*'
});
首先 - 停止在任何地方使用 writeHead。因为它完全重写了响应 headers.
如果旅游这样写:
res.writeHead(200,{"coolHeader":"YesIAm"});
res.writeHead(500);
然后 node.js 将仅发送状态为 500 且没有 header 的响应 "coolHeader";
如果您想更改状态代码,请使用
res.statusCode = ###;
如果你想添加新的 header 使用
res.setHeader("key", "value");
如果你想重写所有 header 则使用 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' : '*'
});
并将所有 writeHead(###)
替换为 res.statusCode = ###;
看起来你正在为应用程序和 socket.io 调用 .listen(我认为这是多余的,因为你正在使用 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);