2015-06-10 2 views
19

Я продолжаю получатьКак включить CORS на express.js 4.x во всех файлах?

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://example.com:2013/socket.io/?EIO=3&transport=polling&t=1433950808025-0 . (Reason: CORS request failed).

в то время как я пытаюсь получить доступ к своим Node.js. Это не работает для меня:

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"); 
    next(); 
}); 

@edit: вот обновленный полный код:

var express = require('express'); 
var http = require('http'); 
var expressvar = express(); 

expressvar.use(function (req, res, next) { 
    res.setHeader('Access-Control-Allow-Headers', 'accept, authorization, content-type, x-requested-with'); 
    res.setHeader('Access-Control-Allow-Methods', 'GET,HEAD,PUT,PATCH,POST,DELETE'); 
    res.setHeader('Access-Control-Allow-Origin', req.header('origin')); 
    next(); 
}); 
expressvar.use(express.static('../')); 
expressvar.use("/socket.io", express.static('../socket.io')); 
var app = http.createServer(expressvar); 
var io = require('socket.io').listen(app); 
app.listen(2013); 
+0

Какой тип методов запроса вы пытаетесь (POST, GET, ...)? Для определенного вам может потребоваться включить 'OPTIONS':' app.options ('*', function (req, res) {res.status (200) .send();}); ' –

+0

Это не помогло. То, что я делаю, пытается включить socket.io из другого порта, и это дает мне ошибку CORS. –

+0

Каковы заголовки ответов в сетевом инспекторе Chrome DevTools? Правильно ли имеет заголовок 'Access-Control-Allow-Origin'? – hassansin

ответ

17

Попробуйте это решение (отредактированный включать полный рабочий код)

var app = require('express')(); 
var server = require('http').Server(app); 
var io = require('socket.io')(server); 

io.set('origins', '*:*'); 

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(); 
    } 
}); 

server.listen(80); 

app.get('/', function (req, res) { 
    res.send('OK'); 
}); 

io.on('connection', function (socket) { 
    socket.emit('news', { hello: 'world' }); 
    socket.on('my other event', function (data) { 
    console.log(data); 
    }); 
}); 
+0

Благодарим вас за ответ, хотя он не работает. Невозможно включить socket.io из-за ошибки CORS. Как установить там заголовки? –

+0

Просто добавлено более полное решение. Кажется, работает здесь с Express 4 – cmlndz

+0

Я думаю, проблема в том, что файл socket.io отправляется через порт 2013, и он блокируется, потому что apache проксирует все через порт 80, но я не могу понять, что мне следует изменить –

3

Попробуйте использовать res.setHeader вместо этого.

Этот пример работает для меня:

app.use(function (req, res, next) { 
    res.setHeader('Access-Control-Allow-Headers', 'accept, authorization, content-type, x-requested-with'); 
    res.setHeader('Access-Control-Allow-Methods', 'GET,HEAD,PUT,PATCH,POST,DELETE'); 
    res.setHeader('Access-Control-Allow-Origin', req.header('origin')); 

    next(); 
}); 
+0

Я получаю' Ошибка: «имя» и «значение» требуются для setHeader(). 'Now :(What I «Я пытаюсь включить socket.io из другого порта, и он дает мне ошибку CORS @edit: когда я комментирую исходный заголовок, он печатает страницу, но все равно не будет включать socket.io из-за этой ошибки –

+0

, которая подразумеваете, что вы не отформатировали аргументы правильно. Убедитесь, что у вас есть два значения строк, разделенные запятой. В противном случае опубликуйте, как выглядит ваш код в OP – Varedis

+0

. Я добавил код по вашему желанию –

6

cors пакет делает это

// npm install --save cors 
var express = require('express'); 
var cors = require('cors'); 
var app = express(); 
app.use(cors()); 
app.use(express.static()); 
app.get('*', function(){}); 
require('http').createServer(app).listen(3000) 
+0

Я использовал ваш код и я до сих пор получаю сообщение об ошибке «Cross-Origin Request Blocked» :(Мне, должно быть, что-то не хватает –

+0

@MateuszBartkowski Wow звучит так, будто вы не одиноки! https://duckduckgo.com/?q=socket.io+cors&ia=qa – Plato

1

Я имел проблемы с это довольно долго, у вас есть функция app.configure? Если так, то это то, что в конечном итоге работает для меня.

app.configure(function() { 
    app.set('port', 3000); 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'jade'); 
    app.use(express.favicon()); 
    app.use(express.logger('dev')); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(app.router); 
    app.use(express.urlencoded()); 
    app.use(express.json()); 
    app.all('/*', function(req, res, next) { 
    res.header('Access-Control-Allow-Origin', '*'); 
    next(); 
    }); 
+0

Я думаю, проблема в том, что файл socket.io отправляется через порт 2013, и он блокируется, потому что apache проксирует все через порт 80, но я не могу опустить голову, что мне изменить –

0

Внутри вашей app.js добавить эти строки кода:

var app = require('express')(); 
var server = require('http').Server(app); 
var io = require('socket.io')(server); 

server.listen(9081); 

app.all('*', function(req, res, next){ 
    origin = req.get('Origin') || '*'; 
    res.set('Access-Control-Allow-Origin', origin); 
    res.set('Access-Control-Allow-Methods', 'GET, POST, OPTIONS'); 
    res.set('Access-Control-Expose-Headers', 'Content-Length'); 
    res.set('Access-Control-Allow-Credentials', 'true'); 
    res.set('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type'); // add the list of headers your site allows. 
if ('OPTIONS' == req.method) return res.send(200); 
    next(); 
}); 

app.get('/', function (req, res) { 
    res.sendfile(__dirname + '/index.html'); 
}); 

io.on('connection', function (socket) { 
    socket.emit('news', { hello: 'world' }); 
    socket.on('my other event', function (data) { 
    console.log(data); 
    }); 
}); 
+0

Я думаю, проблема в том, что Файл socket.io отправляется через порт 2013, и он блокируется, потому что apache проксирует все через порт 80, но я не могу понять, что я должен изменить. –

+0

@MateuszBartkowski Это проверенный код. Примерьте вот это. Используйте любой другой порт, отличный от 80. –

+0

Ошибка для порта 80 выглядит как Ошибка: прослушивание EACCES у export._errnoException (util.js: 746: 11) на Server._listen2 (net.js: 1112: 19) при прослушивании (net.js: 1155: 10) на сервере Server.listen (net.js: 1240: 5) у объекта. (/Users/santanu/Projects/temp/app.js:7:8) в Module._compile (module.js: 460: 26) в Object.Module._extensions..js (module.js: 478: 10) на Module.load (module.js: 355: 32) на Function.Module._load (module.js: 310: 12) на Function.Module.runMain (module.js: 501: 10) –

Смежные вопросы