我创建了一个通过 firebase 发送通知的函数,但我收到了这个错误:
Error fetching user data (a0ZdYX3IgCbssNNRP2oPZyAAEOt1): { Error: www.googleapis.com network timeout. Please try again.
at FirebaseAppError.Error (native)
at FirebaseAppError.FirebaseError [as constructor] (/user_code/node_modules/firebase-admin/lib/utils/error.js:25:28)
at new FirebaseAppError (/user_code/node_modules/firebase-admin/lib/utils/error.js:70:23)
at TLSSocket.<anonymous> (/user_code/node_modules/firebase-admin/lib/utils/api-request.js:106:51)
at emitNone (events.js:86:13)
at TLSSocket.emit (events.js:185:7)
at TLSSocket.Socket._onTimeout (net.js:339:8)
at ontimeout (timers.js:365:14)
at tryOnTimeout (timers.js:237:5)
at Timer.listOnTimeout (timers.js:207:5)
errorInfo:
{ code: 'app/network-timeout',
message: 'www.googleapis.com network timeout. Please try again.' } }
这是由于我(限制 firebase 免费?)或谷歌服务器上的错误,我只需要等待?
我的功能(我知道该功能可以提高速度但问题不存在,我只是想知道我是否是这个错误的原因)这个功能向x天前安装应用程序的用户发送通知, 检索他们的帐户创建日期和他们的 fcm token 保存在数据库中:
'use strict';
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.sendNotificationToNewUser = functions.https.onRequest((request, response) => {
Date.prototype.sameDay = function(d) {
return this.getFullYear() === d.getFullYear()
&& this.getDate() === d.getDate()
&& this.getMonth() === d.getMonth();
}
var query = admin.database().ref("users").orderByKey();
var defaultAuth = admin.auth();
query.once("value")
.then(function(snapshot) {
snapshot.forEach(function(childSnapshot) {
var user_id = childSnapshot.key;
var user_data = childSnapshot.val();
admin.auth().getUser(user_id)
.then(function(userRecord) {
var create_date = userRecord.metadata.createdAt
var date_now = new Date(Date.now());
console.log("Creation date:", create_date);
create_date.setDate(create_date.getDate()+4);
if (create_date.sameDay(date_now)) {
var registrationToken = user_data.fcm_token;
const payload = {
notification: {
body: "blabla",
sound: "default"
},
"data" : {
"key" : "XXX",
"value" : "playstore"
}
};
var options = {
priority: "high",
collapseKey: "playstore"
};
// Send a message to the device corresponding to the provided
// registration token with the provided options.
admin.messaging().sendToDevice(registrationToken, payload, options)
.then(function(response) {
console.log("Successfully sent message:", response);
})
.catch(function(error) {
console.log("Error sending message:", error);
});
}
})
.catch(function(error) {
console.log("Error fetching user data ("+user_id+"):", error);
});
});
});
response.send("OK");
})
最佳答案
您正在向客户端发送响应(“OK”),而无需等待您的查询完成。您应该始终使用异步调用实时数据库和其他 API 返回的 Promise 对象,仅在这些查询完全完成后才触发响应。如果不这样做,就会出现问题。
就目前而言,您的函数需要进行一些重大重组,以便从它正在执行的所有工作中积累所有 promise ,并等待所有这些完成,然后再发送最终响应。
关于javascript - 我的代码中的云功能错误或错误 : www. googleapis.com 网络超时。请再试一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43477015/