npm 包在错误的目录中使用 fs

npm package uses fs in wrong dir

我做了一个非常简单的 npm package 来支持我的 discord 机器人。

在我的机器人代码中,我试图使用我的包中的一个函数。但是,当我启动机器人代码时,我收到此错误:

Error: ENOENT: no such file or directory, open 'prefixes.json'

我在 npm 包 的主目录 中有一个 prefixes.json 文件。在包中执行此代码(returns 错误):

const contents = fs.readFileSync(`prefixes.json`);
const jsonPrefixes = JSON.parse(contents);

当我打开依赖于此包的 discord 机器人时,会执行此代码。 prefix.json 与我的 npm 包的 index.js 位于同一目录中。我尝试了 ./prefix.jsonprefix.json,其中 none 有效。

错误是因为包试图在我的 bot 目录中搜索,而不是他自己的?我该如何克服这个问题?

更新:当我尝试 ./node_modules/kifo/prefixes.json 时它起作用了,但我不希望那样 - 有没有办法提供相对于包的路径?

您需要使用 require() 而不是 fs.readFileSync():

const jsonPrefixes = require('./prefixes.json');
const contents = JSON.stringify(jsonPrefixes); // you don't actually need this

为什么?

之所以 fs.readFileSync() 必须如此,是因为文件 API 在所有编程语言中都是如此。例如,您编写了一个名为 dump 的程序。工作目录必须是用户当前所在的目录,否则:

> cd /my/folder
> ls
test.txt
> dump test.txt
Error: cannot open /path/to/node_modules/dump/test.txt

当然你不会想到这一点。你也不应该。 您不应该期望 fs.readFileSync 使用它自己的模块目录来打开来自 .

的文件

另一方面,require() 旨在加载 javascript 个模块,其中一些来自您自己的项目。所以 require() 将从代码所在的目录打开文件。

require() 函数可以加载 javascript 代码或 JSON 文件。所以在你的情况下你可以使用 require().

如果不是 JSON 怎么办?

如果您不能使用 require(),您可以使用 __dirname 变量。它是一个特殊变量,包含当前正在执行的模块的路径:

const contents = fs.readFileSync(`${__dirname}/prefixes.json`);
const jsonPrefixes = JSON.parse(contents);

不过 JSON 我还是更喜欢用 require().