Я установил CORS на моем сервере node.js на порт 5000 следующим образом:

var app = express();

app.use(cors()); //normal CORS
app.options('*', cors()); //preflight 

app.post('/connect', function(req, res) { 
    console.log("Connection request received !")
});

var port = 5000;
app.listen(port, function () {
    console.log('Listening on port '+port);
});

Теперь я пытаюсь отправить запросы AJAX POST с помощью JQuery, например, на статической веб-странице, открытой с моего жесткого диска:

var xhr = $.post({
            url: 'http://localhost:5000/connect',
            complete: function() {
                console.log("done !")
            },
            crossDomain: true
        });

xhr.fail(function(xhr, status, error){
    alert(error)
})

Функция complete никогда не вызывается, и единственное предупреждение, которое я получаю, - это предупреждение от обработчика XHR fail, содержащее следующую ошибку:

NS_ERROR_DOM_BAD_URI: Access to restricted URI denied

Я думаю, что CORS хорошо настроен, что мне не хватает?


ИЗМЕНИТЬ : для тех, кто в моем случае, лучшее решение, которое я смог найти, - это отправить страницу с сервера:

app.use(express.static('web'))

app.get("/", function(req, res) {
    res.sendFile(__dirname + '/web/HTML/index.html');
});
10
Magix 7 Сен 2016 в 10:45

4 ответа

Лучший ответ

Это код, который я использую. Он находится в моем файле app.js

app.all("/*", function (req, res, next) {

  res.header("Access-Control-Allow-Origin", req.headers.origin);
  res.header("Access-Control-Allow-Credentials",true);
  res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
  res.header('Access-Control-Allow-Headers', 'Content-Type,Accept,X-Access-Token,X-Key,Authorization,X-Requested-With,Origin,Access-Control-Allow-Origin,Access-Control-Allow-Credentials');
  if (req.method === 'OPTIONS') {
    res.status(200).end();
  } else {
    next();
  }
});
4
frikkievb 15 Сен 2016 в 14:29

У меня есть проект, в котором используется корс.

Используемый код узла :

const cors = require('cors');
const express = require('express');
const app = express();

app.use(cors());

/* Connect/other routes here */

Код jquery выглядит немного иначе:

$.post('http://localhost:5000/connect', {}).done( () => {
  // Request complete
}).fail((jqXHR) => {
  // Request failed 
});
0
Joakim Ericsson 12 Сен 2016 в 12:47

CORS не работает с использованием протокола file, потому что там нет сервера для отправки требуемых заголовков. Ваше решение использовать сервер - это единственный способ заставить CORS работать.

0
Andrew Hedges 13 Сен 2016 в 18:38

Я никогда не использовал cors (), поэтому я не могу говорить с этой частью. Но вы можете вручную разрешить совместное использование ресурсов из разных источников, настроив заголовки node.js.

Добавить этот предварительный маршрут во все запросы

app.route('*')
   .all(function(req, res, next) {
     res.header('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS');
     res.header('Access-Control-Allow-Origin', '*');
     res.header('Access-Control-Allow-Headers', 'X-API-TOKEN, Content-Type, Authorization, Content-Length, X-Requested-Wit
h');
   next();
})

Это должно сработать.

1
Timothy Moody 12 Сен 2016 в 00:11