Облачные функции возвращают статус 500 и не отображаются в реестрах

Облачные функции возвращают статус 500 и не отображаются в реестрах

У меня странное поведение, у меня есть несколько http-функций в Firebase Cloud Functions. Они работают отлично, но бывают дни, когда они начинают возвращать статус 500 на некоторое время, а затем возвращаются к нормальной работе на несколько минут, а затем снова начинают возвращать статус 500, такое поведение сохраняется в течение всего дня.

Самое странное, что я не получаю никаких сообщений об ошибках на моем драйвере стека, на самом деле, нет никаких реестров об этих вызовах, как будто вызовы каким-то образом не доходят до служб Google или просто отклоняются, и нет никаких реестров об этом.

Я опубликую реализацию одной из наиболее используемых функций в моем приложении:

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';

admin.initializeApp()

exports.changeOrderStatus_1 = functions.https.onRequest((request, response) =>
{
    //Check Headers
    const clientID = request.get('ClientID');

    if(clientID === null || clientID === undefined || clientID === "")
    {
        console.error(new Error('clientID not provided.'));
        return response.status(500).send('clientID not provided.');
    }

    const unitID = request.get('UnitID');

    if(unitID === null || unitID === undefined || unitID === "")
    {
        console.error(new Error('unitID not provided.'));
        return response.status(500).send('unitID not provided.');
    }

    //Check body
    const orderID = request.body.OrderID;

    if(orderID === null || orderID === undefined || orderID === "")
    {
        console.error(new Error('orderID not provided.'));
        return response.status(500).send('orderID not provided.');
    }

    const orderStatus = request.body.OrderStatus;

    if(orderStatus === null || orderStatus === undefined || orderStatus === "")
    {
        console.error(new Error('orderStatus not provided.'));
        return response.status(500).send('orderStatus not provided.');
    }

    const orderStatusInt = Number.parseInt(String(orderStatus));

    const notificationTokenString = String(request.body.NotificationToken);

    const customerID = request.body.CustomerID;

    const promises: any[] = [];

    const p1 = admin.database().ref('Clients/' + clientID + '/UnitData/'+ unitID +'/FreshData/Orders/' + orderID + '/Status').set(orderStatusInt);

    promises.push(p1);

    if(notificationTokenString !== null && notificationTokenString.length !== 0 && notificationTokenString !== 'undefined' && !(customerID === null || customerID === undefined || customerID === ""))
    {
        const p2 = admin.database().ref('Customers/' + customerID + '/OrderHistory/' + orderID + '/Status').set(orderStatusInt);

        promises.push(p2);

        if(orderStatusInt > 0 && orderStatusInt < 4)
        {
            const p3 = admin.database().ref('Customers/' + customerID + '/ActiveOrders/' + orderID).set(orderStatusInt);

            promises.push(p3);
        }
        else
        {
            const p4 = admin.database().ref('Customers/' + customerID + '/ActiveOrders/' + orderID).set(null);

            promises.push(p4);
        }

        let title = String(request.body.NotificationTitle);
        let message = String(request.body.NotificationMessage);

        if(title === null || title.length === 0)
            title = "?????";

        if(message === null || message.length === 0)
            message = "?????";

        const payload = 
        {
            notification:
            {
                title: title,
                body: message,
                icon: 'notification_icon',
                sound : 'default'
            }
        };

        const p5 = admin.messaging().sendToDevice(notificationTokenString, payload);

        promises.push(p5);
    }

    return Promise.all(promises).then(r => { return response.status(200).send('success') })
        .catch(error => 
            {
                console.error(new Error(error));
                return response.status(500).send(error)
            });
})

И вот как я его вызываю, клиентское приложение работает на платформе Xamarin Forms с использованием языка C#:

        static HttpClient Client;

        public static void Initialize()
        {
            Client = new HttpClient();
            Client.BaseAddress = new Uri("My cloud functions adress");
            Client.DefaultRequestHeaders.Add("UnitID", UnitService.GetUnitID());
            Client.DefaultRequestHeaders.Add("ClientID", AuthenticationService.GetFirebaseAuth().User.LocalId);
        }

  public static async Task<bool> CallChangeOrderStatus(OrderHolder holder, int status)
        {
            Debug.WriteLine("CallChangeOrderStatus: " + status);

            try
            {
                var content = new Dictionary<string, string>();

                content.Add("OrderID", holder.Order.ID);
                content.Add("OrderStatus", status.ToString());
                
                if (!string.IsNullOrEmpty(holder.Order.NotificationToken) && NotificationService.ShouldSend(status))
                {
                    content.Add("CustomerID", holder.Order.SenderID);
                    content.Add("NotificationToken", holder.Order.NotificationToken);
                    content.Add("NotificationTitle", NotificationService.GetTitle(status));
                    content.Add("NotificationMessage", NotificationService.GetMessage(status));
                }

                var result = await Client.PostAsync("changeOrderStatus_1", new FormUrlEncodedContent(content));

                return result.IsSuccessStatusCode;
            }
            catch (HttpRequestException exc)
            {
#if DEBUG
                ErrorHandlerService.ShowErrorMessage(exc);
#endif
                Crashes.TrackError(exc);

                return false;
            }
        }

Эти функции вызываются несколько раз в минуту, но могут оставаться без вызова до часа.

Я отправлял запросы с мобильных подключений, Wi-Fi-подключений, проводных подключений и от разных интернет-провайдеров, но проблема все равно возникает.

Я что-то делаю не так? Я что-то упускаю? Это нестабильность в серверах Google?

решение1

Кажется, вчераизвестная проблема имела место, Я столкнулся с тем же поведением в своих Cloud Functions, и команда поддержки упомянула эту информацию. Если ваша проблема все еще не решена, я рекомендую вам связаться сГруппа поддержки GCPдля того, чтобы они внимательно изучили ваш проект и дали дальнейшие рекомендации по нему :)

Связанный контент