typeError: fs/promises read is not a function

typeError: fs/promises read is not a function

我正在尝试使用 fs/promises 模块。节点版本是 v14.17.0

下面的代码抛出一个错误:TypeError: read is not a function

(async () => {
    'use strict';
    const { open, read } = require('fs/promises');
    const fd = await open('/proc/loadavg', 'r');
    const { bytesRead, buffer } = await read(fd, Buffer.alloc(1024));
    console.log({ bytesRead, data: buffer.toString() });
})()
    .catch(console.error);

当我尝试使用非承诺版本时它有效。

'use strict';

const { open, read } = require('fs');
const { exit } = require('process');

open('/proc/loadavg', 'r', (err, fd) => {
    if (err) {
        console.error(err);
        exit(2);
    }
    read(fd, Buffer.alloc(1024), 0, 1024, 0, (err, bytesRead, buffer) => {
        if (err) {
            console.error(err);
            exit(2);
        }
        console.log({ bytesRead, data: buffer.toString() });
    });
});

为什么第一个不起作用?

编辑:这是 vscode 向我展示的内容。根据一条评论,这不是真的。

我在 fs.d.ts

中找到了类型
function read<TBuffer extends Uint8Array>(
            handle: FileHandle,
            buffer: TBuffer,
            offset?: number | null,
            length?: number | null,
            position?: number | null,
        ): Promise<{ bytesRead: number, buffer: TBuffer }>;

通过 fileHandle.read() 读取 promise 接口,而不是通过 fs.promises.read()

您可以自己手动 promisify fs.read()fs.open(),但是 promise 接口的目的是引导人们使用 fileHandle 接口,这有一些优势。

此外,此代码:

const fd = await open('/proc/loadavg', 'r');

return 不是 fd。它 return 是一个 fileHandle 对象(然后您对其执行 .read(),因此无论如何您都必须更改 .read() 代码和 .close() 代码。