我想用Next.js使用getServerSideProps方法(如在文档中解释 )进行服务器端呈现。
数据应该来自数据库,所以我使用的是mysql包。这将导致以下错误:
Error serializing `.assertions[0]` returned from `getServerSideProps` in "/assertion". Reason: `object` ("[object Object]") cannot be serialized as JSON. Please only return JSON serializable data types.我认为原因是,因为来自mysql的mysql方法返回特殊对象(RowDataPacket)。我想传递给getServerSideProps的结果在记录时如下所示:
[ RowDataPacket { id: 1, title: 'Test' } ]我可以通过用JSON.parse(JSON.stringify(result))包装结果来修复这个错误,但这对我来说似乎很奇怪。
所以,我的简单问题是:mysql.query如何正确地使用和 getServerSideProps ?
或者这可能是Next.js应该解决的一个问题?
谢谢
发布于 2020-07-01 06:42:46
我自己也遇到过这个问题。当我遇到这个问题时,它与MySQL无关。问题是getServerSideProps()希望您返回一个"JSON可序列化数据类型“,这基本上意味着一个简单的ol‘JavaScript对象(波霍)。
要修复它,只需创建一个新的POJO来返回。你可以走的几条路是:
// using spread operator to create new object
const plainData = {
...queryResult
}
// recreating the object with plucked props
const plainData = {
title: queryResult.title,
content: queryResult.content
}
// data conversion (wax-on wax-off)
const plainData = JSON.parse(JSON.stringify(queryResult))您的特定数据在一个数组中,所以您最简单的解决方案是蜡上脱蜡,因为它将支持数组。否则你就得在上面画地图。
为什么这样?
您可以看到您的对象附加了RowDataPacket。这意味着它是RowDataPacket的一个实例,NextJS不允许任何实例,除非它严格等于Object.prototype (参见相关代码)
这似乎很奇怪,但他们已经描述了为什么需要在吉特布的问题上。TL;DR dates会引起客户端的问题,当页面发生水合物时。
https://stackoverflow.com/questions/61188494
复制相似问题