Next.js中getStaticPaths执行Knex查询报错:getaddrinfo ENOTFOUND undefined
问题分析与解决
核心原因
getStaticPaths 是在Next.js构建阶段执行的,而普通页面的服务端逻辑(比如getServerSideProps)是在运行时执行。如果数据库相关的环境变量仅在运行时被注入,构建阶段getStaticPaths里就读不到这些变量,导致Knex的数据库主机配置为undefined,触发DNS解析错误。
解决步骤
1. 确保构建阶段能加载环境变量
本地开发:如果用
dotenv管理环境变量,要确保构建命令执行前先加载.env文件。修改package.json的构建命令:"scripts": { "build": "dotenv -e .env next build" }(需先安装
dotenv-cli:npm install -g dotenv-cli)部署平台(如Vercel、Netlify):在平台的「构建环境变量」配置项中添加数据库相关变量(不要只配置运行时变量),确保构建阶段能读取到。
2. 调整Knex配置与Next.js环境变量传递
在next.config.js中显式传递环境变量,确保构建阶段能访问:
// next.config.js module.exports = { env: { DB_HOST: process.env.DB_HOST, DB_USER: process.env.DB_USER, DB_PASSWORD: process.env.DB_PASSWORD, DB_NAME: process.env.DB_NAME, }, };
然后在Knex配置文件中直接使用这些变量:
// knexfile.js module.exports = { client: 'mysql2', // 根据你的数据库类型调整 connection: { host: process.env.DB_HOST, user: process.env.DB_USER, password: process.env.DB_PASSWORD, database: process.env.DB_NAME, }, };
3. 验证构建时的变量值
在getStaticPaths中添加日志,确认构建阶段是否能读到环境变量:
export async function getStaticPaths() { // 构建时查看终端输出,确认变量是否存在 console.log('构建阶段DB_HOST:', process.env.DB_HOST); // 你的查询逻辑 const paths = await fetchPathsFromDB(); return { paths, fallback: 'blocking' }; }
如果日志输出undefined,说明环境变量加载逻辑有问题,回到步骤1调整。
内容的提问来源于stack exchange,提问作者mohas
相关产品推荐
相关产品推荐

