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.json
和 prefix.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()
.
我做了一个非常简单的 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.json
和 prefix.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()
.