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);
});
});
能帮我解决这个问题吗? 非常感谢
答案 0 :(得分:0)
在Firebase控制台上检查功能日志后,我发现我在功能中放置了错误的文档路径。
var docRef = db.collection('messages').doc(timestamp);
此处时间戳是数字类型,但是函数在此处请求字符串类型。将类型更改为字符串后,问题就解决了。
谢谢