首页 > 解决方案 > npm 包在错误的目录中使用 fs

问题描述

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

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

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

我在npm packageprefixes.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它工作时,但我不希望它那样 - 有没有办法提供相对于包的路径?

标签: node.jsnpmfs

解决方案


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


推荐阅读