node.js - Next.js 从文件夹内的文件获取静态路径名

标签 node.js next.js

我正在尝试使用 getStaticPaths 从公共(public)文件夹内的 JSON 文件名中提取的 id。我的做法如下

export async function getStaticPaths() {
  const directoryPath = path.join(__dirname, "../../../../public/db/");
  var fileNames = [];
  fs.readdir(directoryPath, function (err, files) {
    if (err) {
      return console.log("Unable to scan directory: " + err);
    }
    files.forEach(function (file) {
      fileNames.push(file.substring( 0, file.indexOf(".")))
    });
  });

  console.log("fileNames",fileNames);

  return {
    fallback: false,
    paths: [
      {
        params: {
          reportId: "temp1",
        },
      },
      {
        params: {
          reportId: "temp2",
        },
      },
    ],
  };
}

我正在尝试将文件名推送到名为 fileNames 的数组中。但我只看到一个空数组。我尝试登录我的 forEach 方法,在那里我可以清楚地看到我的名字。所以我的问题是为什么push方法在这里没有做任何事情?

最佳答案

这是因为 readdir 回调是异步调用的,当您到达 console.log("fileNames", fileNames) 时,forEach code> 循环尚未运行。

我建议使用同步 readdirSync版本。

const directoryPath = path.join(__dirname, "../../../../public/db/");
const fileNames = [];
const files = fs.readdirSync(directoryPath);
files.forEach(function (file) {
    fileNames.push(file.substring(0, file.indexOf(".")));
});

console.log("fileNames", fileNames);

或者,基于 promise 的readdir来自fs/promises

import { readdir } from 'fs/promises';

const directoryPath = path.join(__dirname, "../../../../public/db/");
const fileNames = [];
try {
    const files = await readdir(directoryPath);
    files.forEach(function (file) {
        fileNames.push(file.substring(0, file.indexOf(".")));
    });
    console.log("fileNames", fileNames);
} catch (err) {
    console.log("Unable to scan directory: " + err);
}

关于node.js - Next.js 从文件夹内的文件获取静态路径名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73076904/

相关文章:

node.js - 在 Schema 中保存 ObjectId 数组

node.js - 带有重音符号的 NodeJS hmac 摘要问题

javascript - NextJS Link 组件到底触发什么以及如何捕获该事件

reactjs - 将扩展的 NextPage 类型分配给页面组件时出现类型错误

javascript - 事务无法提交,因为它已完成,状态为 : commit

javascript - Mongoose 保存在 async.each 中创建重复项

javascript - 在 Next.js ERR_REQUIRE_ESM 中导入 ES 模块

reactjs - 使用 NextJS,我想以编程方式从 next.config.js 访问 assetPrefix

javascript - 在不刷新页面的情况下更改 URl NEXT.JS

javascript - 我可以检查事件是否在一小时内发生,无论日期如何? Moment.js