Cloud Functions devuelve el estado 500 y no se muestra en los registros

Cloud Functions devuelve el estado 500 y no se muestra en los registros

Tengo un comportamiento extraño, tengo algunas funciones http en Firebase Cloud Functions. Funcionan perfectamente, pero hay días que empiezan a devolver el estado 500 por un tiempo y luego vuelven a funcionar normal unos minutos para luego volver a devolver el estado 500, este comportamiento se mantiene durante todo el día.

Lo más extraño es que no recibo ningún mensaje de error en mi controlador de pila, de hecho, no hay registros sobre estas llamadas, es como si las llamadas no llegaran a los servicios de Google de alguna manera o simplemente fueran rechazadas y allí No existen registros al respecto.

Publicaré la implementación de una de las funciones más utilizadas en mi aplicación:

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)
            });
})

Y así es como lo invoco, la aplicación cliente se ejecuta en la aplicación Xamarin Forms usando el lenguaje 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;
            }
        }

Estas funciones se llaman varias veces por minuto a la vez, pero pueden durar hasta una hora sin ser llamadas.

He enviado las solicitudes desde conexiones móviles, conexiones wifi, conexiones por cable y desde varios proveedores de Internet y el problema persiste.

¿Estoy haciendo algo mal? ¿Me estoy perdiendo de algo? ¿Es inestabilidad en los servidores de Google?

Respuesta1

Parece que ayer unse produjo un problema conocido, Experimenté el mismo comportamiento en mi Cloud Functions y el equipo de soporte mencionó esta información. Si su problema aún no se resuelve, le recomiendo que se comunique con elEquipo de soporte de GCPpara que inspeccionen detenidamente su proyecto y le brinden más asesoramiento al respecto :)

información relacionada