如何解决如何在graphql nest js中使用firebase时间戳?
firebase中的所有日期都存储为时间戳,无论您如何存储它们:ISO字符串还是new Date()
。
但是我不想在客户端发送firestore.Timestamp
实例,因此我需要以某种方式对其进行序列化。
有哪些选择?如何仅发送ISO字符串或unix时间?
解决方法
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;
}
P.S。不要忘了将此标量添加到解析器模块提供程序
@Module({
providers: [
...resolvers,FirebaseTimestampScalar,],})
export class ResolversModule {}
您仍然需要在客户端将其转换为日期,但是在服务器端,它仍为Timestamp
实例,因此看起来更简洁
5。值得一提,但可能没有用
如果您仍然认为需要在客户端“按原样”获取Timestamp
,则可以对时间戳对象进行字符串化,然后在客户端上进行解析
您可以自己完成操作,也可以使用graphql-type-json
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。