javascript - 我的代码中的云功能错误或错误 : www. googleapis.com 网络超时。请再试一次

标签 javascript firebase google-cloud-functions

我创建了一个通过 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/

相关文章:

javascript - 基于 jquery datepicker 数据属性的动态 Mindate

javascript - 如何以编程方式获取网页大小?

javascript - 防止定时器上的 JavaScript 注入(inject)

javascript - json 的 ng-repeat 为另一个 ng-repeat 的值

javascript - 动态渲染 React 组件

ios - firebase 是否可以根据电话数据或其他形式创建用户,避免在应用程序上注册以进行身份​​验证?

android - 无法以列表形式读取 Firebase 数据库中的数据

firebase - 如何从firebase函数中的firebase存储获取图像的尺寸?

node.js - Firebase本地使用配置变量不起作用-: Missing Plaid “Secret” 错误

firebase - 如何避免 Firebase 云函数可能出现的竞争状况?