如何将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 发出经过身份验证的请求?

如何在 apollo graphql 服务器中编写解析 graphql 过滤器

Python将时间戳与输入时间进行比较