node.js - 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 }>;
解决方案
在 Promise 接口中的读取是通过fileHandle.read()
,而不是通过fs.promises.read()
。
你可以手动promisifyfs.read()
和fs.open()
你自己,但是promise 接口的目的是引导人们使用fileHandle 接口而不是它有一些优势。
另外,这段代码:
const fd = await open('/proc/loadavg', 'r');
不返回fd
. 它返回一个 fileHandle 对象(然后您将对其进行操作.read()
,因此无论如何您都必须更改.read()
代码和.close()
代码。
推荐阅读
- java - POST 请求与 POSTMAN/Advance rest 客户端一起正常工作,同时使用 HttpUrlConnection 给出 400 错误
- firebase - 无法访问 Firestore 云函数中的 Firestore 文档
- php - 在 React Native 中将数据插入 MySQL 数据库时出现 JSON 解析错误
- javascript - 使用自调用函数时,为什么不能传递引用?
- java - Intellij 在文件末尾自动生成 java 方法
- python - ImportError:DLL 加载失败:我使用 python 2.7 下载 scipy for windows 64 后找不到指定的模块
- jmeter - 如何忽略损坏的资源以在 JMeter 中获取失败的 HTTP 请求
- amazon-web-services - 创建状态存储桶时,远程后端 S3 的 Terraform 初始化失败
- reactjs - 如何在 React Application for Adobe 分析(adobe 启动)中实现数据层?
- android - 如何在颤振中改变芯片的形状