我试图从数据库中获取数据,这是我的棱镜模型:
model instant_reports {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
created_at DateTime?
updated_at DateTime?
deleted_at DateTime?
timestamp BigInt?
client_id BigInt?
uniq_users BigInt?
}
当我像这样获取数据时
prismaService.instant_reports.findMany({
skip: 0,
take: 30,
});
抛出错误
TypeError: Do not know how serialize a BigInt at JSON.stringify(
)
我甚至不知道如何处理它,有办法改变findMany
方法中的数据处理程序吗?
如果instant_reports
中没有行所以它给我空数组没有错误,所以问题是在数据与BigInt类型
这对我来说很有效。将此代码添加到您的代码的开头。
BigInt.prototype.toJSON = function () {
const int = Number.parseInt(this.toString());
return int ?? this.toString();
};
处理此问题的最简单方法是避免将实体id写入JSON。Stringify函数,因此如果你从prisma:
得到这个const user = prisma.user.create({ data: { id: 1, name: "user"})
如果你使用JSON.stringify(user),如果用户id是一个Bigint,你将得到错误。
在这种情况下的解决方案是
JSON.stringify({...user, id: user.id.toString()})
这个错误是因为JavaScript的JSON。stringify不知道如何处理BigInt类型。因此,在将BigInt字段作为响应发送给客户端之前,我应该为它们创建一个自定义序列化器。这样的:
function bigIntToString(value) {
const MAX_SAFE_INTEGER = 2 ** 53 - 1;
return value <= MAX_SAFE_INTEGER ? Number(value) : value.toString();
}
function serializeInstantReports(instantReports) {
return instantReports.map(report => {
const newReport = { ...report };
if (typeof report.id === 'bigint') newReport.id = bigIntToString(report.id);
// ...
// such convirtions for other BigInt fields
// ...
return newReport;
});
}
然后从这个serializeInstantReports
的取回函数结果返回