如何将firebase时间戳与graphql nest js一起使用?
Posted
技术标签:
【中文标题】如何将firebase时间戳与graphql nest js一起使用?【英文标题】:How to use firebase timestamp with graphql nest js? 【发布时间】:2021-01-20 20:20:35 【问题描述】:firebase 中的所有日期都存储为时间戳,无论您如何存储它们:作为 ISO 字符串,或者就像 new Date()
。
但我不想在客户端发送firestore.Timestamp
实例,所以我需要以某种方式对其进行序列化。
有哪些选择?如何只发送 ISO 字符串或 unix 时间?
【问题讨论】:
【参考方案1】:1。最简单和最愚蠢的解决方案
使用 unix 时间存储日期:
const newItem =
...,
createdAt: Date.now(),
;
itemsCollection.add(newItem);
这样它将被存储为普通的number
,并且可以使用new Date()
转换回正常日期
2。使用第三方库(仅适用于我的架构优先方法)
firestore-graphql-scalars 包含 scalar firebase 时间戳的类型定义和解析器
如果您要使用方案优先的方法,它工作得很好,但我找不到在 Nest JS GraphQL 代码优先方法中使用它的方法
3。自己定义新的标量类型(代码优先方法实现)
最后,我使用代码优先方法提出了这个标量:
@Scalar('FirebaseTimestamp')
export class FirebaseTimestampScalar implements CustomScalar<number, admin.firestore.Timestamp>
description = 'Firebase timestamp';
parseValue(milliseconds: number): admin.firestore.Timestamp
return admin.firestore.Timestamp.fromMillis(milliseconds); // value from the client
serialize(timestamp: admin.firestore.Timestamp): number
return timestamp.toMillis(); // value sent to the client
parseLiteral(ast: ValueNode): admin.firestore.Timestamp
if (ast.kind === Kind.INT)
return admin.firestore.Timestamp.fromMillis(Number(ast.value));
return null;
数据类型:
@ObjectType()
export class DocumentMeta implements IDocumentMeta
@Field(() => ID)
createdBy: string;
@Field(() => ID)
updatedBy: string;
@Field(() => FirebaseTimestampScalar)
createdAt: Date;
@Field(() => FirebaseTimestampScalar)
updatedAt: Date;
附:不要忘记将此标量添加到解析器模块提供程序
@Module(
providers: [
...resolvers,
FirebaseTimestampScalar,
],
)
export class ResolversModule
您仍然需要在客户端将其转换为日期,但在服务器端它仍然是 Timestamp
实例,因此它看起来更干净一些
5。值得一提,但可能没那么有用
如果你仍然认为你需要在客户端获取Timestamp
'as is',你可以字符串化时间戳对象,并在客户端解析它
你可以自己做,也可以使用graphql-type-json
【讨论】:
以上是关于如何将firebase时间戳与graphql nest js一起使用?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 graphql 从 Firebase 使用 Flutter 从 Cloud Firestore 获取数据?
如何将 Unix 纪元时间戳与 SQL 中的 DATE 进行比较?
使用 apollo graphql 对 firebase 身份验证做出反应
如何使用 Firebase Auth 作为 OIDC 向 Amplify GraphQL 发出经过身份验证的请求?