簡體   English   中英

npm 包在錯誤的目錄中使用 fs

[英]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.jsonprefix.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()

如果不是 JSON 呢?

如果您不能使用require()您可以使用__dirname變量。 它是一個特殊變量,包含當前正在執行的模塊的路徑:

const contents = fs.readFileSync(`${__dirname}/prefixes.json`);
const jsonPrefixes = JSON.parse(contents);

但是對於 JSON,我仍然更喜歡使用require()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM