如何在graphql nest js中使用firebase时间戳?
firebase中的所有日期都存储为时间戳,无论您如何存储它们:作为ISO字符串,或作为如何在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
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 {}