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()
代码。
我正在尝试使用 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()
代码。