忽略 firebase.firestore.timestamp

Posted

技术标签:

【中文标题】忽略 firebase.firestore.timestamp【英文标题】:Ignore firebase.firestore.timestamp 【发布时间】:2021-12-19 12:01:14 【问题描述】:

我的项目使用了@Nativescript/firebase(https://github.com/EddyVerbruggen/nativescript-plugin-firebase),忽略了firebase.firestore.timestamp的方法,通过属性返回undefined

以下是最小复制

app.js

import Vue from "nativescript-vue";
import Home from "./components/Home";

var firebase = require("@nativescript/firebase").firebase;

firebase
  .init()
  .then(
    function () 
      console.log("firebase.init done");
    ,
    function (error) 
      console.log("firebase.init error: " + error);
    
  );

new Vue(
  render: (h) => h("frame", [h(Home)]),
).$start();

首页.vue

import  firebase  from "@nativescript/firebase";

export default 
  computed: 
    async message() 
      const Ref = firebase.firestore
        .collection("comments")
        .doc("07bhQeWDf3u1j0B4vNwG");
      const doc = await Ref.get();
      const hoge = doc.data();
      console.log("hoge.commented_at", hoge.commented_at); // CONSOLE LOG: hoge.commented_at Sat Oct 23 2021 22:44:48 GMT+0900 (JST)
      console.log("hoge.commented_at.seconds", hoge.commented_at.seconds); // CONSOLE LOG: hoge.commented_at.seconds undefined
      const hogeToDate = hoge.toDate();
      console.log("hogeToDate", hogeToDate); // no console.log appear
      return hogeToDate; // simulator shows "object Promise"
    ,
  ,
;

我也试过const hogeTimestampNow = firebase.firestore.Timestamp.now(); 然后没有出现console.log...

环境

vue.js Node.js v14.17.6 nativescript v8.1.2 nativescript-vue v2.9.0 @nativescript/firebase v11.1.3

【问题讨论】:

【参考方案1】:

如果您深入了解@nativescript/firebase 的来源,特别是查看/src/firebase-common.ts,您会发现firebase 是自定义实现,而不是普通Firebase Web SDK 通常导出的对象/命名空间。

它使用自定义实现,因此可以根据运行代码的平台进行转换,如/src/firebase.android.ts/src/firebase.ios.ts 所示。

特别重要的是,Firestore 的 Timestamp 对象在向您的代码公开时是 internally converted 到 javascript Date 对象,因为每个平台都有自己的 Timestamp 对象版本。因为暴露的 JavaScript Date 对象没有seconds 属性,所以在尝试访问hoge.commented_at.seconds 时会得到undefined

equivalent of Timestamp#seconds 将是 Math.floor(hoge.commented_at / 1000)(如果您不喜欢依赖 JavaScript 的类型强制,也可以使用 Math.floor(hoge.commented_at.getTime() / 1000) 更明确)。

function getSeconds(dt: Date) 
  return Math.floor(dt.getTime() / 1000)

虽然您可以从 Modular Web SDK (v9+) 导入 Timestamp 对象,但当传递到 NativeScript 插件时,它会变成普通对象(即 seconds: number, nanoseconds: number 而不是 Timestamp)。

import  Timestamp  from 'firebase/firestore/lite';

const commentedAtTS = Timestamp.fromDate(hoge.commented_at);

docRef.set( commentedAt: commentedAtTS.toDate() ) // must turn back to Date object before writing!

【讨论】:

非常感谢!我了解如何在我的项目中转换为秒数。【参考方案2】:

正如@samthecodingman 所说,firebase.firestore.timestamp 不能通过@nativescript/firebase 工作。(https://***.com/a/69853638/15966408)

只需使用普通的 javascript 方法并进行编辑。

我试过了

从 Firestore 获取时间戳,然后转换为毫秒 使用new Date() 获取日期,然后转换为毫秒

并记录相同的毫秒数。

通过火库

const Ref = firebase.firestore.collection("comments").doc("07bhQeWDf3u1j0B4vNwG");
const doc = await Ref.get();
const hoge = doc.data();
console.log("hoge.commented_at in milliseconds: ", Math.floor(hoge.commented_at / 1000)); 
// CONSOLE LOG: hoge.commented_at in milliseconds:  1634996688

通过javascript方法

const getNewDate = new Date("October 23, 2021, 22:44:48 GMT+0900"); 
// same as hoge.commented_at
console.log("getNewDate in milliseconds: ", getNewDate.getTime() / 1000); 
// CONSOLE LOG: getNewDate in milliseconds:  1634996688

【讨论】:

以上是关于忽略 firebase.firestore.timestamp的主要内容,如果未能解决你的问题,请参考以下文章

SVN添加忽略后,怎么解除被忽略的文件

Sourcetree忽略文件

SVN添加忽略后,怎么解除被忽略的文件

SourceTree设置忽略文件

git 配置忽略文件规则

Java Socket 怎么忽略SIGPIPE信号