fs.opendir() 创建的 fs.Dir 上的异步迭代器后 dir.close() 出错

ZYi*_*nMD 5 node.js

2021 年更新:已在2021 年 4 月提交的Nodejs文档中修复了歧义


编辑:这本质上是节点文档的问题。请参阅此处的讨论。


我正在尝试自节点 v12.12 以来添加的fs.Dir类:

// hello-world.js
const fs = require('fs');

(async function () {
  const dir = await fs.promises.opendir(__dirname);
  for await (const dirent of dir) {
    console.log('name:', dirent.name, 'isDir:', dirent.isDirectory());
  }
  return dir.close();
})();

Run Code Online (Sandbox Code Playgroud)
$ node hello-world.js
Run Code Online (Sandbox Code Playgroud)

它似乎按预期工作,记录了目录中每个文件的信息(没有丢失任何一个),但最终它抛出(node:3218) UnhandledPromiseRejectionWarning: Error [ERR_DIR_CLOSED]: Directory handle was closed at Dir.close (internal/fs/dir.js:161:13). 我究竟做错了什么?

jfr*_*d00 6

dir 对象的异步迭代器将在迭代完成时自动关闭 dir。这似乎没有记录,但您可以在此处的代码中看到这一点。

async* entries() {
    try {
      while (true) {
        const result = await this[kDirReadPromisified]();
        if (result === null) {
          break;
        }
        yield result;
      }
    } finally {
      await this[kDirClosePromisified]();
    }
  }
}

ObjectDefineProperty(Dir.prototype, SymbolAsyncIterator, {
  value: Dir.prototype.entries,
  enumerable: false,
  writable: true,
  configurable: true,
});
Run Code Online (Sandbox Code Playgroud)