我正在编写一个小的NodeJS脚本,该脚本需要一个zip文件并将内容提取到一个文件夹中。然后,我在文件系统上搜索提取的zip内容以查找指定的文件类型,然后将其输出到数组。
我面临的问题是脚本的初始运行,在我的“ findFile”功能启动之前,提取过程并未完成。为了解决这个问题,我尝试使用Async / Await,我希望它能够在成功完成解压缩/提取后启动“ findFile”功能。
下面是一个简化的代码示例:
const fs = require('fs-extra');
const unzipper = require('unzipper');
const path = require('path');
const artifact = 'C:\\PATH\\TO\\MY\\ZIP\\FILE.zip;
const dir = 'C:\\PATH\\TO\\MY\\EXTRACTED\\ZIP\\FILE\\CONTENTS';
const findFile = function (dir, pattern) {
const results = [];
fs.readdirSync(dir).forEach(function (dirInner) {
dirInner = path.resolve(dir, dirInner);
const stat = fs.statSync(dirInner);
if (stat.isDirectory()) {
results = results.concat(findFile(dirInner, pattern));
}
if (stat.isFile() && dirInner.endsWith(pattern)) {
results.push(dirInner);
}
});
return results
}
const readZip = async () => {
fs.createReadStream(artifact).pipe(unzipper.Extract({path: 'C:\\LOCATION\\WHERE\\EXTRACTED\\ZIP\\WILL\\GO'}))
await findFile(dir, ".iar");
}
readZip()
最初运行上述代码时,我得到以下信息:
“ UnhandledPromiseRejection警告:错误:ENOENT:没有此类文件或目录,scandir'C:\ PATH \ TO \ EXTRACTED \ ZIP \ CONTENTS'”
但是,在第二次运行代码时,我得到了预期的结果:
[
'C:\\PATH\\TO\\SOME\\FILE.iar',
'C:\\PATH\\TO\\SOME\\FILE.iar',
'C:\\PATH\\TO\\SOME\\FILE.iar'
]
此行为告诉我“ findFile”函数在提取过程完成之前执行。这使我回到了问题:
问题1: 为什么“ findFile”函数没有使用“ await”来使提取过程在执行之前完成?
问题2: 谁能为我提供一些代码示例,说明我如何在仍利用已编写的代码的情况下实现这一目标?
我宁愿不必重写整个脚本,因为我相对确定这是我的语法问题,并且由于我是新手,因此重写整个脚本将花费我很多时间。完成。任何帮助都将不胜感激。...