我正在尝试添加一个SQL查询,以从Postgres数据库填充Next.js页面。我让它工作了一段时间,但我似乎把它弄坏了。我把问题追溯到了这一行:
import { Client } from 'pg';
这基本上导入了一个Postgres客户端,我可以使用它来连接到本地Postgres数据库。当这一行位于我的index.js的顶部时,当我导航到页面或尝试构建时,我会得到错误"Module not found: Can't resolve 'fs"
(完整的堆栈跟踪显示fs
被pg
包含)。
当我注解掉它时,错误就消失了。
通过搜索,我认为这与服务器端代码包含在客户端代码中有关。然而,导入语句必须放在文件的顶部,所以我不知道如何避免这种情况。
我的Postgres代码的 * 其余部分 * 在getServerSideProps中,但是我不能像我提到的那样将import语句移动到那里:
import { Client } from 'pg';
export async function getServerSideProps(context) {
const client = new Client({
host: '...', ...
})
await client.connect()
const res = await client.query(
"SELECT blogpost_content FROM ..."
)
await client.end()
const dbmsg = res.rows[0].blogpost_content;
return {
props: {
dbmsg
},
};
}
我做错了什么?我是next.js的新手,所以看起来我可能选择了错误的连接到数据库的方式。然而,这并没有包括在我下面的教程中,所以我有点即兴发挥。欢迎所有大大小小的建议!
1条答案
按热度按时间trnvg8h31#
我认为是因为这个库使用了
'fs'
(文件系统),无服务器函数无法使用。如何构建Nextjs以在无服务环境中本地运行,您将需要一个客户端,该客户端使用无服务器函数将调用的端点连接以持久化数据。我知道一些lib可以帮助在无服务环境中使用node-pg,比如here,但我喜欢使用prisma
,mongoose
和其他处理这种通信的lib,它们使通信更容易,只需设置一个env url。在某些情况下,如果你需要大规模运行它,通常在连接pgbouncer等数据库之前使用一个池,因为无服务器函数在数据库中运行的方式,你的数据库将同时处理大量连接。但在所有这些之后,我说你可以简单地在docker容器中运行postgres,并使用nextjs上的一些客户端连接。或者在你的计算机上使用postgres客户端,但在你的
localhost:5432
上使用locale,不要直接使用node的文件系统。