[英]npm package uses fs in wrong dir
我制作了一個非常簡單的npm 包來支持我的 discord bot。
在我的機器人代碼中,我試圖使用我的包中的一個函數。 但是,當我啟動機器人代碼時,我收到此錯誤:
Error: ENOENT: no such file or directory, open 'prefixes.json'
我在npm package的主目錄中有一個prefixes.json
文件。 在包中執行此代碼(返回錯誤):
const contents = fs.readFileSync(`prefixes.json`);
const jsonPrefixes = JSON.parse(contents);
當我打開依賴於此包的 discord bot 時,將執行此代碼。 prefix.json
與我的 npm 包的index.js
位於同一目錄中。 我試過./prefix.json
和prefix.json
,都沒有奏效。
錯誤是因為包試圖在我的 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()
。
如果您不能使用require()
您可以使用__dirname
變量。 它是一個特殊變量,包含當前正在執行的模塊的路徑:
const contents = fs.readFileSync(`${__dirname}/prefixes.json`);
const jsonPrefixes = JSON.parse(contents);
但是對於 JSON,我仍然更喜歡使用require()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.