getServerSideProps和mysql(RowDataPacket)

时间:2020-04-13 13:03:41

标签: next.js node-mysql

我想使用explained in the docs之类的getServerSideProps方法对Next.js进行服务器端渲染。

数据应该来自数据库,所以我使用的是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.

我认为其原因是因为query的{​​{1}}方法返回特殊对象(mysql)。登录后,我想传递给RowDataPacket的结果如下:

getServerSideProps

我可以通过用[ RowDataPacket { id: 1, title: 'Test' } ] 包装结果来解决此错误,但这对我来说很奇怪。

因此,我的简单问题是:如何正确使用JSON.parse(JSON.stringify(result))mysql.query

或者这可能是getServerSideProps应该解决的问题吗?

谢谢

1 个答案:

答案 0 :(得分:2)

我自己遇到了这个问题。当我遇到问题时,它与MySQL无关。问题是getServerSideProps()希望您返回一个“ JSON可序列化数据类型”,这基本上意味着一个普通的JavaScript对象(POJO)。

要修复此问题,只需创建一个新的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的实例,除非它严格等于Object.prototype(请参见related code),否则NextJS不允许任何实例

这似乎很奇怪,但是他们已经描述了为什么有必要in a Github Issue。当页面水化时,TL; DR日期会导致客户端出现问题。