Как правильно использовать createReadStream в fs/promises

При использовании API промисов в fs в первую очередь я должен открыть файловый дескриптор и только потом получить доступ к нужному мне методу, в моем случае это createReadStream

 const fileHandle = await fs.open(filePath, 'r')
 const readableStream = fileHandle.createReadStream(opt)

Как мне правильно воспользоваться этит методом через промисы? И самое главное, как правильно и красиво закрыть файловый дескриптор, так как при вставке в блок finally строки await fileHandle?.close() файл не успевает прочитаться и закрывается сразу Вот то, что я пробовал

const fs = require("fs/promises");

async function foo() {
  const fileHandle = await fs.open("text.txt", "r");

  const readableStream = fileHandle.createReadStream();

  try {
    return new Promise((resolve, reject) => {
      let data = "";

      readableStream .on("data", (chunk) => {
        data += chunk;
      });

      readableStream .on("end", () => {
        resolve(data);
      });

      readableStream .on("end", reject);
    });
  } catch (err) {
    console.log(err);
  } finally {
    await fileHandle?.close();
  }
}

foo().then((data) => console.log(data));

Ответы (1 шт):

Автор решения: ksa

Как мне правильно воспользоваться этит методом через промисы?

Например вот так...

const fs = require("fs/promises");

async function foo() {
    let fileHandle
    let data
    try {
        fileHandle = await fs.open("tmp.txt", "r");
        const readableStream = fileHandle.createReadStream();
        data = await new Promise((resolve, reject) => {
            let data = "";
            readableStream.on("data", chunk => data += chunk);
            readableStream.on("end", _ => resolve(data));
            readableStream.on("error", reject);
        });
    } catch (err) {
        console.error(err);
    } 
    fileHandle?.close()
    return data ?? null
}

foo().then(data => console.log(data));
→ Ссылка