NodeJS 如何在Cloud Functions for Firebase中获取服务器时间戳?

jei2mxaa  于 2023-01-20  发布在  Node.js
关注(0)|答案(9)|浏览(140)

我知道你可以在web、ios和android中提取服务器时间戳--但是Firebase的新云功能呢?我不知道如何在那里获取服务器时间戳?用例是我想在电子邮件到达时添加时间戳。
在Web上,它是Firebase.数据库.服务器值.时间戳
但是在功能节点服务器接口中似乎没有这个功能?
我想已经很晚了,我可能没有抓住重点...
编辑
我是这样初始化的

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

那就叫这个...

Firebase.database.ServerValue.TIMESTAMP

但是,这是从客户端集成。在函数,Firebase是不是这样初始化。我已经尝试

admin.database().ServerValue.TIMESTAMP

以及

fb.ServerValue.TIMESTAMP
5fjcxozz

5fjcxozz1#

由于您已经在使用admin SDK,因此正确的语法为:

admin.database.ServerValue.TIMESTAMP
iecba09b

iecba09b2#

如果您使用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

(2021年至2022年)

// Cloud Firestore
admin.firestore.Timestamp.now();
nkoocmlb

nkoocmlb3#

只是为了向未来的读者澄清:
admin.database.ServerValue.TIMESTAMP返回一个non-null Object,它是一个用于自动填充当前时间戳的占位符值。它不包含实际时间戳。数据库将在执行命令时替换此占位符。
如果您在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 question
如果您想将Date.now()用于计算或任何其他一般用途,那么Date.now()database函数之外也能很好地工作。

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

两者都使用unix timeunix time是自1970年1月1日星期四00:00:00协调世界时(UTC)以来经过的秒数,与时区无关。它在客户端和服务器上是相同的数字(...或几乎是:-)。

h9a6wy2h

h9a6wy2h4#

我自己是node.js新手,但是Date.now()在我的测试中工作正常。

    • 编辑**

我误解了您的问题--没有意识到您想要对存储在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);
    });
jdgnovmf

jdgnovmf5#

取决于使用情形

用例1

你想设置文档域到服务器时间戳
示例可以是

user {
  email: "example.com",
  lastUpdated: admin.firestore.FieldValue.serverTimestamp(),
}
  • 注意serverTimestamp返回一个非空对象,是用于自动填充当前时间戳的占位符值。它不包含实际时间戳。数据库将在执行命令时替换此占位符 *
  • 返回一个与set()、create()或update()一起使用的标记,以在写入的数据中包含服务器生成的时间戳。

@return在set()、create()或update()调用中使用的字段值标记。*

用例2

你想使用服务器时间戳为你的函数逻辑

if (currentTime == 6pm) // TODO: send push notifications
else // TODO: do nothing

为此你可能会想做一些

admin.firestore.Timestamp.now()admin.firestore.Timestamp.fromDate(new Date())

良好读数:https://bigcodenerd.org/firebase-server-timestamp-cloud-functions/

6bc51xsx

6bc51xsx6#

在客户端上等效于Timestamp.now()的cloud函数中使用以下代码,将返回当前时间戳

admin.firestore.Timestamp.now()

但是如果你想从Date对象初始化Timestamp,你可以按如下方式操作

admin.firestore.Timestamp.fromDate(new Date())

如果你想为将来或过去的日期初始化时间戳,那么首先通过解析字符串或设置你想设置的时间来初始化Date对象,并将其传递给Timestamp.fromDate()

var date = new Date('Wednesday, October 30, 2019 09:10 PM')
//or date = new Date('2014-06-30T06:40:53+05:30')
var timestamp = admin.firestore.Timestamp.fromDate(date)
ejk8hzay

ejk8hzay7#

在2020年8月16日的文件中。
https://cloud.google.com/firestore/docs/manage-data/add-data#server_timestamp

// Get the `FieldValue` object
const FieldValue = admin.firestore.FieldValue;

// Create a document reference
const docRef = db.collection('objects').doc('some-id');

// Update the timestamp field with the value from the server
const res = await docRef.update({
  timestamp: FieldValue.serverTimestamp()
});

下面是我在代码中的用法:

const createUserDoc = (user) => {
    const FieldValue = admin.firestore.FieldValue
    return db.collection('users').doc(user.uid).set({
        memberSince: FieldValue.serverTimestamp(),
    })
}
vmpqdwk3

vmpqdwk38#

您可以尝试:
常量时间戳= www.example.com();admin.firestore.Timestamp.now();

plupiseo

plupiseo9#

console.log("Show current timestamp, in Milliseconds= " + Date.now());

相关问题