首页 > 解决方案 > 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 }>;

标签: node.jsfile-descriptor

解决方案


在 Promise 接口中的读取是通过fileHandle.read(),而不是通过fs.promises.read()

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

另外,这段代码:

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

不返回fd. 它返回一个 fileHandle 对象(然后您将对其进行操作.read(),因此无论如何您都必须更改.read()代码和.close()代码。


推荐阅读