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

Next.js:getStaticPaths读取文件名后数组为空,push无效原因

问题原因与解决方案

核心问题是异步代码执行顺序不匹配:fs.readdir默认是异步回调API,你在回调函数外声明的fileNames数组,会在回调还没执行(也就是还没读取到文件列表)的时候就被你使用/返回,因此输出为空;而forEach内部能看到文件名,是因为forEach是在回调执行阶段(已经拿到文件列表)才运行的。

解决方法

推荐使用fs.promises.readdir(Promise异步版本)配合async/await,确保代码按预期顺序执行:

import fs from 'fs/promises';
import path from 'path';

export async function getStaticPaths() {
  // 拼接public文件夹的绝对路径
  const publicDir = path.join(process.cwd(), 'public');
  // 读取public目录下的所有文件
  const allFiles = await fs.readdir(publicDir);

  // 过滤JSON文件并去除后缀
  const fileNames = allFiles
    .filter(file => file.endsWith('.json'))
    .map(file => file.slice(0, -5)); // 去掉".json"后缀(长度为5)

  // 生成Next.js需要的静态路径格式
  const paths = fileNames.map(id => ({
    params: { id }
  }));

  return {
    paths,
    fallback: false
  };
}

额外注意事项

  • 确保process.cwd()指向项目根目录,Next.js项目中该值默认正确,无需额外调整。
  • 必须过滤.json文件,避免将public目录下的图片、HTML等其他资源纳入路径生成逻辑。
  • 若使用低版本Node.js,fs.promises可能需通过require('fs').promises导入,ES模块环境下直接用import fs from 'fs/promises'即可。

内容的提问来源于stack exchange,提问作者CraZyDroiD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 15:57:20