Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何在Firebase的云函数中获取服务器时间戳?_Node.js_Firebase_Firebase Realtime Database_Google Cloud Functions_Firebase Admin - Fatal编程技术网

Node.js 如何在Firebase的云函数中获取服务器时间戳?

Node.js 如何在Firebase的云函数中获取服务器时间戳?,node.js,firebase,firebase-realtime-database,google-cloud-functions,firebase-admin,Node.js,Firebase,Firebase Realtime Database,Google Cloud Functions,Firebase Admin,我知道您可以在web、ios和android中提取服务器时间戳,但是Firebase的新云功能呢?我不知道如何在那里获取服务器时间戳?用例是我想在电子邮件到达时给它加上时间戳 在web上是Firebase.database.ServerValue.TIMESTAMP 但在功能节点服务器界面中似乎不可用 我想已经很晚了,我可能没有抓住重点 编辑 我是这样的 admin.initializeApp(functions.config().firebase); const fb = admin.data

我知道您可以在web、ios和android中提取服务器时间戳,但是Firebase的新云功能呢?我不知道如何在那里获取服务器时间戳?用例是我想在电子邮件到达时给它加上时间戳

在web上是Firebase.database.ServerValue.TIMESTAMP

但在功能节点服务器界面中似乎不可用

我想已经很晚了,我可能没有抓住重点

编辑

我是这样的

admin.initializeApp(functions.config().firebase);
const fb = admin.database()
然后,就这样叫它

Firebase.database.ServerValue.TIMESTAMP
但是,这是来自客户端集成。在函数上,Firebase不是这样初始化的。我试过了

admin.database().ServerValue.TIMESTAMP


我自己是node.js新手,但在我的测试中工作

编辑


我误解了你的问题——没有意识到你想给存储在Firebase数据库中的数据加时间戳。我以为你只是想在运行云功能的服务器上获取时间。如果您想给存储在Firebase数据库中的收到的电子邮件加时间戳,那么使用
admin.database.ServerValue.timestamp
无疑是最好的方法

只是为了我自己的教育,我写了下面的函数来看看时间是如何比较的。我希望云功能服务器和数据库服务器上的时间同步到一个非常准确的时间参考。运行此函数时,数据库时间戳通常在
Date.now()值的100毫秒内。数据库时间戳稍微晚一点是合理的,因为云函数需要一些时间连接到数据库并执行写入

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

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

admin.database.ServerValue.TIMESTAMP

如果您使用Firebase Admin SDK,以下是正确的语法(选中2019-08-27):


为了向未来的读者澄清:


admin.database.ServerValue.TIMESTAMP
返回一个
非空对象
,是自动填充当前时间戳的占位符值。它不包含实际的时间戳。数据库将在执行命令时替换此占位符

如果您在
数据库.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]
在和中查看更多有关它的信息

Date.now()

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

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

在云函数中使用以下内容(相当于在客户端),这将返回当前时间戳

admin.firestore.Timestamp.now()
但如果您想从Date对象初始化Timestamp,您可以按如下操作

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


它在2020年8月16日的文件中

//获取'FieldValue'对象
const FieldValue=admin.firestore.FieldValue;
//创建文档引用
const docRef=db.collection('objects').doc('some-id');
//使用来自服务器的值更新时间戳字段
const res=等待docRef.update({
timestamp:FieldValue.serverTimestamp()
});
下面是我在代码中使用它的方式:

const createUserDoc=(用户)=>{
const FieldValue=admin.firestore.FieldValue
返回db.collection('users').doc(user.uid).set({
memberSince:FieldValue.serverTimestamp(),
})
}
取决于用例 案例1 您想将文档字段设置为服务器时间戳

例如

user {
  email: "example.com",
  lastUpdated: admin.firestore.FieldValue.serverTimestamp(),
}
注意
serverTimestamp
返回一个非空对象,是用于自动填充当前时间戳的占位符值。 它不包含实际的时间戳。数据库将在执行命令时替换此占位符

*返回与set()、create()或update()一起使用的sentinel,以在写入的数据中包含服务器生成的时间戳

@返回 用于调用set()、create()或update()的FieldValue sentinel*

案例2 您希望为您的逻辑函数使用服务器时间戳

if (currentTime == 6pm) // TODO: send push notifications
else // TODO: do nothing
为此,你可能想做一些类似的事情

admin.firestore.Timestamp.now()
admin.firestore.Timestamp.fromDate(新日期())
好的阅读:您可以尝试:


constamp timestamp=admin.firestore.timestamp.now()

据我所知,
ServerValue.TIMESTAMP
在Firebase的云函数中同样可用。你能分享吗?Hi@FrankvanPuffelen-我用一个初始化和不起作用的示例编辑了原始文件。Date.now()是获取节点服务器时间,还是从客户端计算机获取计算时间?还是使用标准化的时钟?如果我把我的电脑时间设置为一个时间,did Date.now()然后设置为另一个时间,did Date.now()我会得到两个不同的结果吗?@JustinHandley:更新了我的答案
Date.now()
是服务器上运行云功能的时间。它完全独立于任何客户端计算机上的时间。admin.database.ServerValue.TIMESTAMP是唯一可接受的解决方案,当您使用Firebase规则测试
this==now
(博尔特)这是我想要的简单答案-谢谢@frank van puffenhow用它打印时间戳(毫秒)?admin.database.ServerValue.TIM
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)
user {
  email: "example.com",
  lastUpdated: admin.firestore.FieldValue.serverTimestamp(),
}
if (currentTime == 6pm) // TODO: send push notifications
else // TODO: do nothing