web-dev-qa-db-ja.com

Cloud Functions for Firebaseでサーバーのタイムスタンプを取得するにはどうすればよいですか?

Web、ios、およびAndroidでサーバーのタイムスタンプを取得できることは知っていますが、Firebaseの新しいCloud Functionsはどうですか?サーバーのタイムスタンプを取得する方法がわかりませんか?ユースケースは、メールが到着したときにタイムスタンプを付けたいということです。

Webでは、Firebase.database.ServerValue.TIMESTAMPです。

しかし、それは機能ノードサーバーインターフェースでは利用できないようです?

私はそれが遅いと思うし、私はここでポイントを逃しているかもしれません...

編集

私はこのように初期化しています

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

そして、このように呼ばれています。

Firebase.database.ServerValue.TIMESTAMP

しかし、それはクライアント側の統合によるものです。関数では、Firebaseはこのように初期化されません。私はもう試した

admin.database().ServerValue.TIMESTAMP

そして

fb.ServerValue.TIMESTAMP
37
Justin Handley

既にadmin SDKを使用しているため、正しい構文は次のとおりです。

admin.database.ServerValue.TIMESTAMP
80

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
47
Paul

私はnode.jsを初めて使用しますが、テストでは Date.now() が機能します。

編集

私はあなたの質問を誤解しました。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);
    });
11
Bob Snyder

将来の読者のために明確にするために:

admin.database.ServerValue.TIMESTAMPnon-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の質問 を参照してください。

Date.now()は、計算やその他の一般的な用途に使用したい場合、database関数の外側で正常に機能します。

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

両方ともunix timeを使用しています。これは、1970年1月1日木曜日の協定世界時(UTC)00:00:00から経過した秒数であり、タイムゾーンとは無関係です。クライアントとサーバーで同じ番号です(...またはほぼ:-)。 nix time を参照してください。

10
Spiral Out