【问题标题】:How to get serverTimestamp via Angularfire or firebase如何通过 Angularfire 或 firebase 获取 serverTimestamp
【发布时间】:2018-05-08 13:56:35
【问题描述】:

我找不到从 firestore 获取 serverTimestamp 的方法。要么使用 firestore 本身,要么使用 angularfire。

我发现很多 github 问题的解决方案都不起作用。我猜是因为版本不同?

"@firebase/app": "^0.1.10",
"angularfire2": "^5.0.0-rc.6.0",
"firebase": "^4.13.1",

我尝试过的代码替代方案:

import * as firebase from 'firebase';
firebase.firestore.FieldValue.serverTimestamp();

ERROR TypeError:无法读取未定义的属性“FieldValue”

import * as firebase from 'firebase';
firebase.database.ServerValue.TIMESTAMP;

ERROR TypeError: 无法读取未定义的属性“ServerValue”

constructor( private afs: AngularFirestore ) { }
this.afs.firestore.FieldValue.serverTimestamp();

“FirebaseFirestore”类型上不存在属性“FieldValue”。

【问题讨论】:

    标签: angular angularfire2


    【解决方案1】:

    只做:

    import * as firebase from 'firebase';
    

    导入所有 Firebase 模块,这对于生产来说不是一个好的做法。 最佳做法是像这样使用裸导入:

    import * as firebase from 'firebase/app'; 
    import 'firebase/firestore';
    

    这只会在您的应用中导入 Firestore 模块。然后你可以这样做:

    get timestamp() {
    return firebase.firestore.FieldValue.serverTimestamp();
    };
    

    【讨论】:

    • createdAt _methodName: "FieldValue.serverTimestamp"
    • 它在上面创建的数据不是时间戳
    • @Midhilaj,我的回答是导入 firestore 库以避免在代码中导入整个 firebase 的最佳方式。在否决投票之前,您是否通读了答案?
    【解决方案2】:

    我在我的项目中有这个工作:

    import { AngularFirestore } from 'angularfire2/firestore';
    import { CollectionReference, Query } from '@firebase/firestore-types'; // Not usefull for your problem
    import * as firebase from 'firebase';
    
    @Injectable()
    export class MyService {
    
      constructor(private db: AngularFirestore) {
          console.log("firebase.firestore.FieldValue.serverTimestamp()");
          console.log(firebase.firestore.FieldValue.serverTimestamp());
      }
    }
    

    在我的包裹里:

    "firebase": "^4.12.1",
    "angularfire2": "^5.0.0-rc.5-next"
    

    packages.json 文件中没有这个:

    “@firebase/app”

    【讨论】:

    • 谢谢,但这对我没有帮助。最后,更新 angularfire 有所帮助。
    【解决方案3】:

    最后的帮助是卸载所有与 firebase 相关的东西,正如我在问题中提到的那样:

    "@firebase/app": "^0.1.10",
    "angularfire2": "^5.0.0-rc.6.0",
    "firebase": "^4.13.1",
    

    然后再次运行npm install firebase angularfire2 --save

    这给了我:

    "angularfire2": "^5.0.0-rc.7",
    "firebase": "^5.0.1",
    

    这解决了我所有的问题。

    将 firebase 导入为:

    import * as firebase from 'firebase';
    

    时间戳代码本身:

    get timestamp() {
      return firebase.firestore.FieldValue.serverTimestamp();
    }
    

    11 月 17 日编辑: 如果您使用前面提到的 import import * as firebase from 'firebase';,您将在开发者控制台中收到以下警告:

    您似乎正在使用 Firebase JS 的开发版本 开发工具包。将 Firebase 应用部署到生产环境时,建议 仅导入您打算使用的单个 SDK 组件。

    对于模块构建,这些可以通过以下方式获得 (替换为组件的名称 - 即 auth、数据库、 等):

    CommonJS 模块: const firebase = require('firebase/app'); 要求('firebase/');

    ES 模块:从 'firebase/app' 导入 firebase;进口 'firebase/';

    Typescript: import * as firebase from 'firebase/app';进口 'firebase/';

    所以改成:

    import * as firebase from 'firebase/app';
    import 'firebase/firestore';
    

    【讨论】:

    • 如何导入firebase
    • createdAt _methodName: "FieldValue.serverTimestamp"
    • 它在上面创建的数据不是时间戳
    • @Midhilaj 你可能会在推送新项目时使用 JSON.stringify,这就是你获得地图记录_methodName: "FieldValue.serverTimestamp 的原因。如果你用扩展运算符替换它:afs.collection<Item>('items').add({...item)
    【解决方案4】:

    自 firebase 8.0.0 以来,如何导入 firebase Release Notes 发生了重大变化

    在导入之前

    import * as firebase from 'firebase/app'
    

    但是现在,您应该使用导入

    import firebase from 'firebase/app'
    

    您仍然应该只导入 firestore 来访问服务器时间戳

    import firebase from 'firebase/app'
    import 'firebase/firestore'
    

    并在您的应用中使用

    firebase.firestore.FieldValue.serverTimestamp()
    

    【讨论】:

    • 最新版本的 AngularFire(Firebase 9+、AngularFire 7+)由于重新设计以减小包大小而进行了进一步的重大更改。 Firebase 团队目前的建议是通过将导入更改为“firebase/compat/app”和“firebase/compat/firestore”来使用兼容模式。
    【解决方案5】:

    我解决了这个表格:

    进口: import { AngularFirestore } from '@angular/fire/firestore';

    代码:

    constructor(private db: AngularFirestore) {}
    
    private getTimestamp(): Object {
        return this.db.firestore['_firebaseApp'].firebase_.firestore.FieldValue.serverTimestamp();
    }
    

    依赖关系:

      "@angular/fire": "^5.3.0",
      "firebase": "^7.7.0",
    

    【讨论】:

      【解决方案6】:

      看看这个

      1. Import firestore ## import { firestore } from 'firebase/app';
      2. get serverTimestamp ## createdAt = firestore.FieldValue.serverTimestamp();

      Angular Firestore - serverTimestamp

      【讨论】:

        【解决方案7】:
        1. 从 'firebase/compat/app' 导入 * 作为 firebase;

        ......

        ......

        1. 那就试试这些
        • timestamp = firebase.default.firestore.FieldValue.serverTimeStamp()

        • 时间戳 = firebase.firestore.FieldValue.serverTimeStamp()

        【讨论】:

          猜你喜欢
          • 2018-05-16
          • 2017-06-03
          • 2015-05-21
          • 1970-01-01
          • 1970-01-01
          • 2015-11-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多