忽略 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的主要内容,如果未能解决你的问题,请参考以下文章