node.js - 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.json
,prefix.json
但都没有奏效。
错误是因为包试图在我的机器人目录中搜索,而不是他自己的吗?我该如何克服呢?
更新:当我尝试./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()
.
推荐阅读
- python - Tkinter 继承的类在 Ubuntu 上无法正常运行
- laravel - 路线 [/createhotel] 未定义。拉拉维尔 5.4
- elasticsearch - ElasticSearch 多搜索查询不返回结果
- macos - cmake libclang 与 macos 上的自制 llvm
- c - 双面印刷-C
- javascript - 通过 JS 将脚本附加到 HTML
- wpf - 在 WPF 中精确定位字形文本
- vba - 动态excel超链接
- java - 使用 java 验证 Json 响应
- xpath - 无法使用 xPath 和命名空间提取 SOAPUI 属性传输中的值