错误:ENOENT,没有这样的文件或目录“未定义”
Posted
技术标签:
【中文标题】错误:ENOENT,没有这样的文件或目录“未定义”【英文标题】:Error: ENOENT, No such file or directory 'undefined' 【发布时间】:2021-12-29 00:53:40 【问题描述】:请帮忙!我一直在到处寻找解决方案,包括在官方 Moralis 论坛上提问,到目前为止,没有人能够给我一个解决方案。我已经在这里呆了 3 天了,仍然在同一个地方。假设我花了很多时间查看这段代码,以至于我实际上开始理解它而且我什至不是程序员......到目前为止,我已经看到其他人有类似的“ENOENT”错误但是他们的后面跟着一个丢失的文件或类似的东西。然而,我的问题只是说“未定义”,并没有告诉我什么是未定义的,或者我应该如何定义它。据我所知,我在根文件夹中,我已经安装了所有依赖项,完成了“npm install”,安装了“canvas”,做了“npm init”,清理了缓存,删除了画布,重新安装了画布,删除了“node_modules”文件夹,卸载 npm,然后重新安装 npm。不管我总是遇到同样的错误。
添加一些背景信息,这是我直接从 Moralis YouTube 页面观看的原始教程视频。
Generate NFTs with this simple code (this could make you millions) PART 1
这是他们 GitHub 上的官方骨干代码,我只将视频和 GitHub 上的几行更改为我自己的链接。这是 GitHub 的链接
Moralis Mutants NFT Collection | Generative Art Engine
这是我运行“node index.js”时得到的输出
PS C:\Users\Eli\Documents\moralis-mutants-nft-engine-main> node index.js
##################
# Generative Art #
# - Generating your NFT collection
##################
-----------------
Mutating 1 of 10000
- rarity: rare
- dna: 01--02-04-02-01-010-03-03-04
C:\Users\Eli\Documents\moralis-mutants-nft-engine-main\node_modules\canvas\lib\image.js:91
SetSource.call(img, src);
^
Error: ENOENT, No such file or directory 'undefined'
at setSource (C:\Users\Eli\Documents\moralis-mutants-nft-engine-main\node_modules\canvas\lib\image.js:91:13)
at Image.set (C:\Users\Eli\Documents\moralis-mutants-nft-engine-main\node_modules\canvas\lib\image.js:62:9)
at C:\Users\Eli\Documents\moralis-mutants-nft-engine-main\node_modules\canvas\index.js:34:15
at new Promise (<anonymous>)
at loadImage (C:\Users\Eli\Documents\moralis-mutants-nft-engine-main\node_modules\canvas\index.js:23:10)
at C:\Users\Eli\Documents\moralis-mutants-nft-engine-main\index.js:83:25
at new Promise (<anonymous>)
at loadLayerImg (C:\Users\Eli\Documents\moralis-mutants-nft-engine-main\index.js:82:10)
at C:\Users\Eli\Documents\moralis-mutants-nft-engine-main\index.js:344:29
at Array.forEach (<anonymous>)
at saveFile (C:\Users\Eli\Documents\moralis-mutants-nft-engine-main\index.js:343:15)
at handleFinal (C:\Users\Eli\Documents\moralis-mutants-nft-engine-main\index.js:389:31)
at startCreating (C:\Users\Eli\Documents\moralis-mutants-nft-engine-main\index.js:392:11)
at Object.<anonymous> (C:\Users\Eli\Documents\moralis-mutants-nft-engine-main\index.js:448:1)
at Module._compile (node:internal/modules/cjs/loader:1097:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1149:10)
errno: 2,
code: 'ENOENT',
path: 'undefined',
syscall: 'fopen'
Node.js v17.1.0
我现在也一直在尝试调试几个小时,这就是我在 Visual Studio Code 中运行默认调试器时得到的结果
C:\Program Files\nodejs\node.exe .\index.js
################## index.js:298
# Generative Art # index.js:299
# - Generating your NFT collection index.js:300
################## index.js:301
----------------- index.js:316
Mutating 1 of 10000 index.js:317
- rarity: rare index.js:323
- dna: 01--02-04-01-02-05-04-04-04 index.js:335
Uncaught Error: ENOENT, No such file or directory 'undefined'
Process exited with code 1
【问题讨论】:
如果我们可以看到文件 C:\Users\Eli\Documents\moralis-mutants-nft-engine-main\index.js,我们可以开始跟踪堆栈跟踪并查看代码是什么涉及。问题可能是函数调用中的一些错误参数,在错误发生之前深入了一大堆层,或者在极少数情况下,模块安装错误。 @jfriend00 我包含了一个指向 github 的链接,其中包含来自 Moralis 的原始 index.js 文件。不过我会在这里再次发布,这是一个更直接的链接。如果不完全相同,我的索引文件几乎完全相同。我唯一更改的文件是 config.js 文件,这些是视频专门说要更改的少数更改,与 github 上的方向相同。 github.com/ashbeech/moralis-mutants-nft-engine/blob/main/…这个链接有全部代码。 【参考方案1】:在与您一起调试时,我将其放入答案中只是因为我需要传达多行代码,而这些代码实际上在注释中不起作用。
看起来问题出在https://github.com/ashbeech/moralis-mutants-nft-engine/blob/main/index.js中的这段代码:
// propagate information about required layer contained within config into a mapping object
// = prepare for drawing
let results = constructLayerToDna(newDna, layers, rarity);
let loadedElements = [];
// load all images to be used by canvas
results.forEach((layer) =>
loadedElements.push(loadLayerImg(layer));
);
当它调用loadLayerImg(layer)
时,该层似乎有问题,并且不包含它应该包含的一些属性。 layer
来自 results
,它来自对 constructLayerToDna()
的调用,根据评论,它正在从您的配置中读取信息。因此,配置中似乎缺少某些内容或不正确,导致results
数组出现错误。
【讨论】:
我实际上只是想通了,我会在答案中发布它,但考虑到我是如何解决问题的,我认为你刚才在代码中指出的内容是有道理的。【参考方案2】:我找到了罪魁祸首!所以发生的事情是,在“Base_head”的一个图层文件夹中,我有 5 个不同稀有度级别的文件夹,但是我只有 2 个基本头选项,所以我有一个“普通”的图像,一个“传奇”的图像”并将其他 3 个稀有文件夹留空用于“Base_head”层,因为我没有其他基础头。我认为某个图层稀有度的文件夹是否为空并不重要。所以我通过用相同的图像填充其他 3 个稀有文件夹来测试这是否是一个问题,用于“普通”稀有“基本头”-> 所以稀有“普通、罕见、稀有和超级稀有”得到相同的图像和然后我将第二张图片保存在传奇的稀有文件夹中。这似乎可以解决它。我尝试了一些不同的方法,尝试降低图像的分辨率,考虑到程序可以处理和抽出多大的图像,这可能是某种瓶颈,但是我现在可以使用所有原始的 4320x4320px 图像及其相应的文件夹,它最终以该分辨率抽出 NFT。
简而言之,如果您有图层文件夹,每个文件夹中都有各种稀有文件夹,那么您需要确保每个文件夹中至少有一个图像。您不能将任何文件夹留空,否则由于无法在所述文件夹中找到图像而无法运行。
这实际上与您指出的 @jfriend00 一致。您提到“当它调用 loadLayerImg(layer) 时,该层似乎有问题,并且不包含它应该包含的一些属性。”
好吧,如果图层文件夹是空的,或者图层文件夹中的稀有文件夹是空的,那么程序将得出结论“图层不包含某些属性”,即图像哈哈。花了几天时间,它最终成为一个很难找到的简单修复。谢谢大家,希望这可以帮助人们走向未来!
【讨论】:
以上是关于错误:ENOENT,没有这样的文件或目录“未定义”的主要内容,如果未能解决你的问题,请参考以下文章
proxyquire 错误:ENOENT:没有这样的文件或目录,scandir
错误:ENOENT:没有这样的文件或目录,在进行 Yarn 安装时使用 lstat