2016-09-07 21 views
10

mam CORS ustawień na moim serwerze node.js na porcie 5000 w następujący sposób:Odrzucono żądanie POST AJAX - CORS?

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

Jestem teraz próbuje wysyłać żądania AJAX POST przy użyciu JQuery jak tak, to w statycznej strony otwartego z mojego twardego dysku:

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

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

funkcja complete nigdy nie nazywa, a jedynym alert pojawia się alert z obsługi XHR fail zawierający następujący błąd:

NS_ERROR_DOM_BAD_URI: Access to restricted URI denied 

Myślę, że CORS jest dobrze skonfigurowany, czego mi brakuje?


EDIT: dla tych, w moim przypadku, najlepszym rozwiązaniem mogę znaleźć było wysłać stronę z serwera:

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

app.get("/", function(req, res) { 
    res.sendFile(__dirname + '/web/HTML/index.html'); 
}); 
+0

@PraveenKumar to pytanie nie jest duplikatem tego: http://stackoverflow.com/questions/7969265. Przyjęta odpowiedź ma umożliwić CORS zapobieganie problemom z polityką krzyżową, co zrobiłem. Staraj się nie oznaczać zbyt szybko duplikatu. – Magix

+0

Ponownie otwarte. Wygląda na problem z materiałami NodeJS ... Zobaczmy, czy ludzie NodeJS na to odpowiedzą. –

+1

Bardzo dziękuję – Magix

Odpowiedz

3

To jest kod, którego używam. Znajduje się on w moich app.js złożyć

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

Akceptuję twoją odpowiedź, ponieważ, mimo że nie rozwiązuje to bezpośrednio problemu, daje dobre obejście, dopóki nie zostanie naprawiony moduł 'cors'. Ponadto kod jest czystszy niż @ TimothyMoody's.Thank you! – Magix

+1

'if (req.method === 'OPTIONS')' uratowało mnie. Dzięki!! – Lourens

1

nigdy nie używałem Cors(), więc nie mogę mówić do tego utworu. Ale można ręcznie zezwolić na współdzielenie zasobów pochodzących z różnych źródeł, konfigurując nagłówki node.js.

Dodaj tej wstępnej trasy na wszystkie żądania

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

To powinno działać.

+0

Sprytne rozwiązanie, na pewno go wypróbuję – Magix

0

Mam projekt, który używa cors.

węzeł kod używany jest tylko:

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

app.use(cors()); 

/* Connect/other routes here */ 

kod jquery wyglądać Litte inaczej:

$.post('http://localhost:5000/connect', {}).done(() => { 
    // Request complete 
}).fail((jqXHR) => { 
    // Request failed 
}); 
+0

To prawie dokładnie odpowiada mojemu kodowi, z wyjątkiem tego, że nie włączasz żądań przedlotowych i nie korzystam z 'wykonanego' xhr oddzwaniania ... – Magix

0

CORS nie działa przy użyciu protokołu file bo tam nie ma tam serwer, aby odesłać wymagane nagłówki. Twoje rozwiązanie korzystania z serwera to jedyny sposób, aby CORS działał.

+0

Chcę, aby serwer wysyłał mi nagłówki, gdy AJAXing, a nie podczas ładowania strony, tak nie działa. Kiedy AJAXing rzeczywiście istnieje serwer, który powinien przesłać mi nagłówki i powinno wystarczyć – Magix

+0

Przepraszam, chodzi o to, że strona w protokole 'file' nie ma nazwy hosta do wysłania w żądaniu Ajax, więc serwer odpowiadający nie może sprawdzić, czy pasuje do reguł dostępu CORS. –