Запрос POST AJAX отклонен - CORS?
У меня есть установка 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 хорошо настроен, , что мне не хватает?
EDIT: для тех, кто в моем случае, лучшим решением, которое я смог найти, было отправить страницу с сервера:
app.use(express.static('web'))
app.get("/", function(req, res) {
res.sendFile(__dirname + '/web/HTML/index.html');
});
Ответы
Ответ 1
Это код, который я использую. Он находится в моем файле 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();
}
});
Ответ 2
Я никогда не пользовался 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();
})
Это должно работать.
Ответ 3
У меня есть проект, который использует cors.
Используемый node код:
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
});
Ответ 4
CORS не работает с использованием протокола file
, потому что там нет сервера для отправки требуемых заголовков. Ваше решение использовать сервер - единственный способ заставить CORS работать.