如何在graphql nest js中使用firebase时间戳?

如何在graphql nest js中使用firebase时间戳?,firebase,graphql,nestjs,apollo,Firebase,Graphql,Nestjs,Apollo,firebase中的所有日期都存储为时间戳,无论您如何存储它们:作为ISO字符串,或作为new Date() 但是我不想在客户端发送firestore.Timestamp实例,所以我需要以某种方式序列化它 有哪些选择?如何仅发送ISO字符串或unix时间?1。最简最哑解 使用unix时间存储日期: const newItem = { ..., createdAt: Date.now(), }; itemsCollection.add(newItem); 这样,它将被存储为普通的num

firebase中的所有日期都存储为时间戳,无论您如何存储它们:作为ISO字符串,或作为
new Date()

但是我不想在客户端发送
firestore.Timestamp
实例,所以我需要以某种方式序列化它

有哪些选择?如何仅发送ISO字符串或unix时间?

1。最简最哑解 使用unix时间存储日期:

const newItem = {
  ...,
  createdAt: Date.now(),
};

itemsCollection.add(newItem);
这样,它将被存储为普通的
number
,并且可以使用
new date()

2.使用第三方库(仅适用于我的模式优先方法) 包含firebase时间戳的类型定义和解析程序

如果您选择scheme-first方法,它工作得非常好,但我找不到一种方法在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;
  }
}
注意:不要忘记将这个标量添加到解析器模块提供程序中

@Module({
  providers: [
    ...resolvers,
    FirebaseTimestampScalar,
  ],
})
export class ResolversModule {}
在客户端,您仍然需要将其转换为日期,但在服务器端,它仍然是
Timestamp
实例,所以看起来有点干净

5.值得一提,但可能没那么有用 若您仍然认为需要在客户端获取时间戳,那个么您可以将时间戳对象字符串化,并在客户端解析它

你可以自己做,也可以使用

@Module({
  providers: [
    ...resolvers,
    FirebaseTimestampScalar,
  ],
})
export class ResolversModule {}