Извлечь TImestamp из результата функции - PullRequest
0 голосов
/ 09 октября 2019

Итак, у меня есть такой интерфейс:

interface Test {
    // ...
    created_at: Timestamp;
    // ...
}

, и я возвращаю объект из функции, подобной этой:

export const getTest = functions.https.onCall(async (data, context) => {
    if (!context.auth) {
        return null;
    }

    let snap = await admin
                 .firestore()
                 .collection('test')
                 .get();

    return snap.docs.map(r => ({ // Add id to the output
        id: r.id,
        ...r.data()
    })[0];
});

Так что я должен получить объект метки времени в моемприложения, но это то, что я получаю в консоли Chrome, когда я пытаюсь получить объект из функции следующим образом:

// Using AngularFireFunctions
let result: Test = await this.fns.httpsCallable<void, Test>('getTest')().toPromise();

Это все содержание result.created_at:

enter image description here

Когда я звоню result.created_at.toDate(), я получаю ошибку ....created_at.toDate is not a function.

Что я могу сделать, чтобы изменить это?

Это то, с чем я сейчас застрял:

result.created_at = new Date(result.created_at._seconds * 1000);

1 Ответ

2 голосов
/ 09 октября 2019

Похоже, вы ожидаете, что вызываемая функция сохранит тип данных объектов, возвращаемых из нее. Это не совсем так, как это работает. Функция будет сериализовать переданные объекты как JSON, теряя всю информацию о типе объекта, включая тип Timestamp. Временная метка сериализуется с использованием ее внутреннего представления, которое вы видите в выходных данных журнала. Я бы не стал писать код, который зависит от этого, поскольку он, очевидно, использует скрытые детали реализации.

Вместо этого вы, вероятно, должны вместо этого преобразовать эту метку времени в обычный объект JavaScript и использовать ее в возвращаемом результате. Затем на стороне клиента вам нужно будет написать код, который будет понимать, как вы решили представлять эту временную метку. Это дополнительная работа, но она изолирует клиента от знания этих частных деталей реализации.

Я предлагаю поместить часть Timestamp в секунды и наносекунды в простой старый объект, заменив существующее поле Timestamp, а затем преобразовав этот объектобратно в Timestamp на клиенте, используя конструктор Timestamp , который принимает в качестве аргументов секунды и компоненты nanos.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...