Подтвердить что ты не робот

Как получить временную метку сервера в облачных функциях для Firebase?

Я знаю, что вы можете вытащить временную метку сервера в Интернете, ios и android, но как насчет новых функций Cloud для Firebase? Я не могу понять, как получить там временную метку сервера? Случай использования - это желание отправить по электронной почте сообщение по электронной почте, когда оно придет.

В Интернете это Firebase.database.ServerValue.TIMESTAMP

Но, похоже, это не доступно в интерфейсе сервера node?

Я думаю, что уже поздно, и мне может не хватать здесь точки...

ИЗМЕНИТЬ

Я инициализирую это

admin.initializeApp(functions.config().firebase);
const fb = admin.database()

Затем он называется так.

Firebase.database.ServerValue.TIMESTAMP

Но это от интеграции на стороне клиента. В функциях Firebase не инициализируется следующим образом. Я пробовал

admin.database().ServerValue.TIMESTAMP

и

fb.ServerValue.TIMESTAMP
4b9b3361

Ответ 1

Поскольку вы уже используете SDK администратора, правильный синтаксис:

admin.database.ServerValue.TIMESTAMP

Ответ 2

Если вы используете Firebase Admin SDK, вот правильный синтаксис (проверено 2019-08-27):

const admin = require('firebase-admin');
// or
// import * as admin from 'firebase-admin';

// Using Cloud Firestore
admin.firestore.FieldValue.serverTimestamp()

// Using Realtime Database
admin.database.ServerValue.TIMESTAMP

Ответ 3

Я новичок в node.js, но Date.now() работает в моих тестах.

Edit

Я неправильно понял ваш вопрос - не понимал, что вам нужна отметка времени, которую вы хранили в базе данных Firebase. Я думал, вы просто хотели бы получить время на сервере, который запускал вашу облачную функцию. Если вы хотите создать отметку времени, когда полученное электронное письмо хранится в базе данных Firebase, использование admin.database.ServerValue.TIMESTAMP без сомнения является наилучшим подходом.

Только для моего собственного образования я написал следующую функцию, чтобы посмотреть, как сравниваются времена. Я ожидаю, что время на сервере облачной функции и сервере базы данных синхронизируется с очень точным указанием времени. Когда я запускаю эту функцию, метка времени базы данных обычно находится в пределах ста миллисекунд значения Date.now(). Временная метка базы данных немного позже разумна, учитывая, что для облачной функции требуется некоторое время для подключения к базе данных и выполнения записи.

exports.timeTest = functions.database.ref('/test/trigger')
    .onWrite(event => {

        const now= Date.now();
        console.log('now=', now);

        const timeVals = {
          dateNow : now,
          serverTimestamp : admin.database.ServerValue.TIMESTAMP
        };

        return event.data.ref.parent.child('times').update(timeVals);
    });

Ответ 4

Просто чтобы уточнить для будущих читателей:

admin.database.ServerValue.TIMESTAMP возвращает non-null Object и является значением-заполнителем для автоматического admin.database.ServerValue.TIMESTAMP текущей метки времени. Он не содержит фактическую метку времени. База данных заменит этот заполнитель, когда выполнит команду.

Если вы используете его внутри database.ref тогда он работает так, как вы ожидаете, и является предпочтительным способом ввода метки времени:

var sessionsRef = firebase.database().ref("sessions");
sessionsRef.push({
startedAt: firebase.database.ServerValue.TIMESTAMP // this will write 'startedAt: 1537806936331'
});

Но если вы попытаетесь использовать его вне функции базы данных (например, чтобы вернуть время сейчас или сделать некоторые вычисления), он вернет объект, который вы не можете использовать:

console.log(firebase.database.ServerValue.TIMESTAMP) // this will return an [object Object]

Подробнее об этом читайте в firebase.database.ServerValue и в этом вопросе SO.

Date.now() прекрасно работает вне функции database если вы хотите использовать ее для расчета или любого другого общего использования.

console.log(Date.now()); // this will return 1537806936331

Они оба используют unix time которое представляет собой количество секунд, прошедших с 00:00:00 всемирного координированного времени (UTC), четверг, 1 января 1970 года, и оно не имеет отношения к часовому поясу. Это одинаковое число на клиенте и на сервере (... или почти :-). Смотрите время Unix.