You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 00:01:05