【问题标题】:npm package uses fs in wrong dirnpm 包在错误的目录中使用 fs
【发布时间】:2021-09-07 05:33:24
【问题描述】:

我制作了一个非常简单的npm package 来支持我的不和谐机器人。

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

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

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

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

当我打开依赖于这个包的不和谐机器人时,会执行此代码。 prefix.json 与我的 npm 包的 index.js 位于同一目录中。我试过./prefix.jsonprefix.json,都没有用。

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

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

【问题讨论】:

  • 小心提供这样的路径。如果有人在没有npm install 的情况下使用npx,则可能无法正常工作,因为您的模块位于临时文件夹中。

标签: node.js npm fs


【解决方案1】:

您需要使用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()

【讨论】:

    猜你喜欢
    • 2017-12-08
    • 1970-01-01
    • 2014-08-27
    • 2016-10-05
    • 2018-06-06
    • 1970-01-01
    • 2022-12-20
    • 1970-01-01
    • 2022-08-02
    相关资源
    最近更新 更多