fs.readDirSync 更改目录时死亡 o.O

fs.readDirSync dies when changing directory o.O

在 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 比较陌生。

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

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

how I can get around this by only using relative pathing (no other modules or __dirname). I am relatively new to NodeJs.

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

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


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

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