2017-02-09 3 views
4

ich wie ein Neuling fühle mich hier, aber ich versuche, eine einfache AJAX-Anforderung von einem Browser ausgeführt werden eine GCF zuzugreifen und Chrome berichtet:Access-Control-Allow-Origin arbeiten nicht Google Cloud Funktionen GCF

XMLHttpRequest kann https://us-central1-bustling-opus-830.cloudfunctions.net/Authenticate nicht laden. Kein 'Access-Control-Allow-Origin'-Header ist auf der angeforderten -Ressource vorhanden. Herkunft 'https://beast.reachboarding.com.au' ist daher nicht Zugriff erlaubt.

Ich habe eine Funktion namens Authentifizieren bekommt (wie oben dargestellt), das ist ein Eimer mit genannt:

bustling-opus-830.appspot.com 

Ich habe verwendet gsutil CORS, um die folgende JSON-Datei mit:

[{ 
    "origin": ["https://beast.localdev.com.au","*"], 
    "responseHeader": ["Content-Type"], 
    "method": ["GET", "HEAD", "DELETE", "OPTIONS"], 
    "maxAgeSeconds": 3600 
}] 

Mit dem folgenden Befehl:

gsutil cors set cors.json gs://bustling-opus-830.appspot.com/ 

Und dann die folgende Ausgabe aus dem entsprechenden Befehl get erhalten:

gsutil cors get gs://bustling-opus-830.appspot.com/ 

[{"maxAgeSeconds": 3600, "method": ["GET", "HEAD", "DELETE", "OPTIONS"], "origin": ["https://beast.localdev.com.au", "*"], "responseHeader": ["Content-Type"]}] 

ich das Standardbeispielcode verwenden, die zur Verfügung gestellt wird, wenn Sie eine neue Funktion erstellen, wie unten angegeben:

/** 
* Responds to any HTTP request that can provide a "message" field in the body. 
* 
* @param {!Object} req Cloud Function request context. 
* @param {!Object} res Cloud Function response context. 
*/ 
exports.helloWorld = function helloWorld(req, res) { 
    // Example input: {"message": "Hello!"} 
    if (req.body.message === undefined) { 
     // This is an error case, as "message" is required. 
     res.status(200).send('No message defined!'); 
    } else { 
     // Everything is okay. 
     console.log(req.body.message); 
     res.status(200).send(req.body.message); 
    } 
}; 

Und eine einfache HTML mit dem folgenden Javascript:

$.ajax({ 
    url: "https://us-central1-bustling-opus-830.cloudfunctions.net/Authenticate", 
    type: "POST", 
    data: { 
     message: 'Testing' 
    }, 
    dataType: 'json', 
    success: function (response) { 
     console.log(response); 
    }, 
    error: function (xhr, status) { 
     console.log(xhr); 
    } 
}); 

Das verursacht den Fehler.

In meiner DEV-Konsole kann ich die Netzwerkanforderung durchlaufen sehen. Hier sind die HTTP-Response-Header Ich erhalte sind:

cache-control:private 
content-encoding:gzip 
content-length:27 
content-type:text/html; charset=utf-8 
date:Wed, 08 Feb 2017 03:45:50 GMT 
etag:W/"7-274e639a" 
function-execution-id:azc1zqfb1tq8 
server:Google Frontend 
status:200 
vary:Accept-Encoding 
x-cloud-trace-context:70e08d634a9644c32530326de0471a64;o=1 
x-cloud-trace-context:70e08d634a9644c32530326de0471a64 
x-powered-by:Express 

Ich hätte erwartet, dass die Access-Control-Allow-Origin-Header innerhalb der Antwort-Header, um zu sehen, um anzuzeigen, dass es erlaubt *, aber ich bin auf jeden Fall ich sehe es nicht. obwohl

Das Verrückte ist, dass, wenn ich auf dem Netzwerk-Element suchen, und klicken Sie auf Antwort, die ich erhalten:

Testing 

was darauf schließen lässt, dass alle Dinge gleich sind, es tatsächlich lief!

Ich entschuldige mich, wenn dies bereits beantwortet wurde, aber ich habe nach so vielen verschiedenen Keywords gesucht und nichts scheint mein Problem gelöst zu haben. Ich dachte, ein neues Paar Augen (und etwas anständiges Fachwissen) würde helfen.

Vielen Dank im Voraus!

+0

Ist der richtige gsutil Befehl 'gsutil cors gesetzt cors.json gs: // busling-opus-830', oder Sie bereits sicher, dass' gsutil cors gesetzt cors.json gs: //bustling-opus-830.appspot. com/'sollte das gleiche erreichen? Ich frage, weil die Dokumente unter https://cloud.google.com/storage/docs/cross-origin#Configuring-CORS-on-a-Bucket einfach das unqualifizierte Formular 'gsutil cors set cors-json-file.json gs verwenden : // Beispiel' – sideshowbarker

+0

Ich glaube, dass die beiden Befehle syntaktisch gleich sind. Der einzige Unterschied, den ich sehe, ist der Name der JSON-Datei. Ich habe cors.json benutzt, wo das Beispiel cors-json-file.json hat. Meinst Du das? – Encoder

+0

Nein, ich meinte nur 'gs: // bustling-opus-830.appspot.com /' vs 'gs: // haste-opus-830' – sideshowbarker

Antwort

9

Ihre Google Cloud-Funktion für den Vordergrund (HTTP) muss die entsprechenden CORS-Header in den Antworten auf die AJAX-Clientanforderungen festlegen. Die Anforderungs- und Antwortparameter von HTTP Functions haben äquivalente Eigenschaften zu den entsprechenden ExpressJS-Objekten, die zum Festlegen der CORS-Header und zum Beantworten von Preflight-Anforderungen bei Bedarf verwendet werden können.

Zum Beispiel:

exports.Authenticate = function Authenticate (req, res) { 
    //set JSON content type and CORS headers for the response 
    res.header('Content-Type','application/json'); 
    res.header('Access-Control-Allow-Origin', '*'); 
    res.header('Access-Control-Allow-Headers', 'Content-Type'); 

    //respond to CORS preflight requests 
    if (req.method == 'OPTIONS') { 
     res.status(204).send(''); 
    } 

    //continue function ... 

}; 

Die Kopf- und Logik oben geändert werden soll, um die besonderen Bedürfnisse Ihres Dienstes zu reflektieren, soll aber hoffentlich helfen Ihnen den Einstieg.

+1

Ryan du tot Set Legende! Ich kann nicht glauben, dass das so einfach war. Ich habe die Header hinzugefügt und den Refresh-Button gedrückt und es hat sofort wie erwartet funktioniert. Ich danke dir sehr! – Encoder

+0

Du bist mein Retter. Ich habe den ganzen Tag versucht, das herauszufinden und das war das einzige, was es behoben hat. –

Verwandte Themen