【问题标题】:fs.readDirSync dies when changing directory o.O更改目录时 fs.readDirSync 死亡 o.O
【发布时间】:2021-06-10 05:38:15
【问题描述】:

在一个 node.js 项目上工作,我发现了一些有趣的东西。

测试 1

这是我的初始目录结构供参考:

├── test
    └── test.js
├── start.js
├── package.json

start.js

const fs = require('fs');

console.log(fs.readdirSync("./test"));

使用node start.js 运行脚本。

输出

['test.js']

测试 2

我更改了目录结构并再次尝试:

├── src
    ├── test
        └── test.js
    ├── start.js
├── package.json

这次使用node ./src/start.js运行脚本。

输出

Error: ENOENT: no such file or directory, scandir './test'.

请有人解释为什么会发生这种情况以及为什么会这样:

require("./test/test.js");

以及如何仅使用相对路径(没有其他模块或__dirname)来解决这个问题。 我对 NodeJs 比较陌生。

  • 操作系统:Windows
  • 节点版本:14.15.3

【问题讨论】:

    标签: javascript node.js commonjs


    【解决方案1】:

    您传递给fs.readdirSync() 的路径中的./ 是相对于当前工作目录,而不是相对于__dirname

    当您使用节点./src/start.js 启动应用程序时,您当前的工作目录是src 的父级。因此,当您尝试fs.readdirSync("./test") 时,它不会查找test 子目录的位置。

    我怎样才能通过仅使用相对路径(没有其他模块或 __dirname)来解决这个问题。我对 NodeJs 比较陌生。

    好吧,如果你想指定一个相对于当前模块位置的相对路径,那么你必须使用__dirname 来构造一个相对路径,因为当前工作目录对你的应用来说是全局的,是什么fs.readdirSync() 和除 require() 之外的几乎所有函数都用于解析相对路径,并且取决于应用启动时的系统工作目录。

    模块相对路径是使用__dirname 构造的。这就是你在 nodejs 中的做法。


    require() 有自己的一套规则(您可以看到 here),这些规则与 fs.readdirSync() 或其他使用当前工作目录的库函数毫无关系。

    require() 的规则包含各种特定于模块加载的内容(例如默认查看 node_modules 子目录)。

    【讨论】:

    • 啊,谢谢你的澄清。我感觉它与操作系统级别的界面有关,但我也是新手,所以不太明白。
    • @shammakh2 - 你真的应该使用__dirname 来构建一个相对于你当前模块的路径。这是 nodejs 中 CommonJS 模块中的最佳实践。
    • 哦,谢谢你通知我。我会这样做的
    猜你喜欢
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 2022-06-25
    • 2018-06-23
    • 1970-01-01
    相关资源
    最近更新 更多