Firebase云功能显示错误“请求的资源上没有'Access-Control-Allow-Origin'标头。”

时间:2018-08-02 05:20:33

标签: angular firebase google-cloud-firestore

Firebase平台调用Firebase云功能时,会出现以下错误:

  

开机自检   https://us-central1-xxxxxxx-device-android-app.cloudfunctions.net/addMessage   500()行程:1无法加载   https://us-central1-xxxxxxx-device-android-app.cloudfunctions.net/addMessage:   请求中没有'Access-Control-Allow-Origin'标头   资源。来源'https://xxxxxxx-device-android-app.firebaseapp.com'   因此,不允许访问。响应具有HTTP状态代码   500.跨域读取阻止(CORB)阻止了跨域响应https://us-central1-xxxxxxx-device-android-app.cloudfunctions.net/addMessage   MIME类型为text / plain。看到   https://www.chromestatus.com/feature/5629709824032768了解更多   详细信息。

在云功能代码中,我尝试使用其他Firebase数据库存储消息:Firestore和实时数据库。我已经使用实时数据库评论了该部分。十分奇怪的是,此错误仅在我使用Firestore时发生。其他部分是相同的,只有当我使用Firestore时,才会发生错误...

在Firebase平台端(https://xxxxxxx-device-android-app.firebaseapp.com)中,该函数将位置消息发布到Firebase云函数中,代码为:

postGeolocation(){
      //AJAX POST JSON from javascript to nodejs server
      var xhr = new XMLHttpRequest();
      var timestamp = Math.round((new Date()).getTime() / 1000);
      // HTTP Option1: Firebase cloud functions: addMessage (secure path)
      var url = "https://us-central1-xxxxxxx-android-app.cloudfunctions.net/addMessage";

      console.log("latitude: "+this.globalvar.latitude + " " + "longitude: "+this.globalvar.longitude);
      xhr.open("POST", url, true);
      xhr.setRequestHeader("Content-Type", "application/json");
      xhr.onreadystatechange = function () {
          if (xhr.readyState === 4 && xhr.status === 200) {
              var json = JSON.parse(xhr.responseText);
            //  console.log(json.email + ", " + json.password);
          }
      };

      var data = JSON.stringify({"tag": this.globalvar.userIdentifier, "latitude":this.globalvar.latitude, "longitude":this.globalvar.longitude, "timestamp": timestamp});
      xhr.send(data);
  }

在云函数端(https://us-central1-xxxxxxx-device-android-app.cloudfunctions.net/addMessage)中,完整代码为:

'use strict';

// The Cloud Functions for Firebase SDK to create Cloud Functions and setup triggers.
const functions = require('firebase-functions');
const admin = require('firebase-admin');
const cors = require('cors')({origin: true});

// The Firebase Admin SDK to access the Firebase Firestore.
admin.initializeApp(functions.config().firebase);
var db = admin.firestore();

// The Firebase Admin SDK to access the Firebase Realtime Database.
//admin.initializeApp();

// Take the text parameter passed to this HTTP endpoint and insert it into the
// Realtime Database under the path /messages/:pushId/original
exports.addMessage = functions.https.onRequest((req, res) => {
  cors(req, res, () => {
    // Grab the text parameter.
    const user = req.body.tag;
    const latitude = req.body.latitude;
    const longitude = req.body.longitude;
    const timestamp = req.body.timestamp;

    var date = new Date();
    var n = date.toDateString();
    var time = date.toLocaleTimeString();
    var datetime = n + ' ' + time;
    console.log("send data to realtime db");

    // Push the new message into the Realtime Database using the Firebase Admin SDK.
    // var msgRef = admin.database().ref('/messages').push({user: user, latitude: latitude, longitude: longitude, timestamp: timestamp, servertime: datetime});
    // res.status(200).send(msgRef);

    // Add the new message into the Firestore
    var docRef = db.collection('messages').doc(timestamp);
    var setAda = docRef.set({
      user: user,
      latitude: latitude,
      longitude: longitude,
      timestamp: timestamp,
      servertime: datetime
    });
    res.status(200).send(setAda);
  });
});

能帮我解决这个问题吗? 非常感谢

1 个答案:

答案 0 :(得分:0)

在Firebase控制台上检查功能日志后,我发现我在功能中放置了错误的文档路径。

var docRef = db.collection('messages').doc(timestamp);

此处时间戳是数字类型,但是函数在此处请求字符串类型。将类型更改为字符串后,问题就解决了。

谢谢

相关问题