next.js 在getServerSideProps中使用pg库

1hdlvixo  于 2023-10-18  发布在  其他
关注(0)|答案(1)|浏览(107)

我正在尝试添加一个SQL查询,以从Postgres数据库填充Next.js页面。我让它工作了一段时间,但我似乎把它弄坏了。我把问题追溯到了这一行:

import { Client } from 'pg';

这基本上导入了一个Postgres客户端,我可以使用它来连接到本地Postgres数据库。当这一行位于我的index.js的顶部时,当我导航到页面或尝试构建时,我会得到错误"Module not found: Can't resolve 'fs"(完整的堆栈跟踪显示fspg包含)。
当我注解掉它时,错误就消失了。
通过搜索,我认为这与服务器端代码包含在客户端代码中有关。然而,导入语句必须放在文件的顶部,所以我不知道如何避免这种情况。
我的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的新手,所以看起来我可能选择了错误的连接到数据库的方式。然而,这并没有包括在我下面的教程中,所以我有点即兴发挥。欢迎所有大大小小的建议!

trnvg8h3

trnvg8h31#

我认为是因为这个库使用了'fs'(文件系统),无服务器函数无法使用。如何构建Nextjs以在无服务环境中本地运行,您将需要一个客户端,该客户端使用无服务器函数将调用的端点连接以持久化数据。我知道一些lib可以帮助在无服务环境中使用node-pg,比如here,但我喜欢使用prismamongoose和其他处理这种通信的lib,它们使通信更容易,只需设置一个env url。在某些情况下,如果你需要大规模运行它,通常在连接pgbouncer等数据库之前使用一个池,因为无服务器函数在数据库中运行的方式,你的数据库将同时处理大量连接。
但在所有这些之后,我说你可以简单地在docker容器中运行postgres,并使用nextjs上的一些客户端连接。或者在你的计算机上使用postgres客户端,但在你的localhost:5432上使用locale,不要直接使用node的文件系统。

相关问题