【问题标题】:Node js FileHandle read method throws invalid argument errorNode js FileHandle读取方法抛出无效参数错误
【发布时间】:2020-10-23 12:47:10
【问题描述】:

根据 Node 文档,FileHandle.read() 接受两种类型的参数,多个对象或一个对象。但是,当我传递对象时,我得到:TypeError [ERR_INVALID_ARG_TYPE]: The "buffer" argument must be an instance of Buffer, TypedArray, or DataView. Received an instance of Object.

文档参考是 here 用于常规读取,here 用于“对象”读取。

"Object" read 表示它是在:v13.11.0 中添加的。 我正在使用 v14.4.0。

这是我正在使用的代码:

    fs_p.open(FILENAME, 'r')
        .then((fileHandler) => {
            console.log(fileHandler);
            const dyn_head = Buffer.alloc(12);

            fileHandler.read({ buffer: dyn_head })
                .then((bytesRead, buffer) => {
                    console.log("Reading")
                }).catch((err) => {
                    console.log(err)
                });

        }).catch((err) => {
            console.log("err")
        });

fs_p 是 fs.promises。

如果您想知道为什么我使用“对象”读取,我有时不会使用所有参数,并且我想让代码干净。

如果有帮助的话。我在 Linux 上。

【问题讨论】:

    标签: javascript node.js fs


    【解决方案1】:

    所以,.read() 的这种形式在节点 v14 中不起作用。我在调试器中追踪到它,它直接进入了这段代码:

    https://github.com/nodejs/node/blob/master/lib/internal/fs/promises.js#L251

    async function read(handle, buffer, offset, length, position) {
      validateFileHandle(handle);
      validateBuffer(buffer);            // <== fails here
    
      if (offset == null) {
        offset = 0;
      } else {
        validateInteger(offset, 'offset');
      }
    
      length |= 0;
    
      if (length === 0)
        return { bytesRead: length, buffer };
    
      if (buffer.length === 0) {
        throw new ERR_INVALID_ARG_VALUE('buffer', buffer,
                                        'is empty and cannot be written');
      }
    
      validateOffsetLengthRead(offset, length, buffer.length);
    
      if (!NumberIsSafeInteger(position))
        position = -1;
    
      const bytesRead = (await binding.read(handle.fd, buffer, offset, length,
                                            position, kUsePromises)) || 0;
    
      return { bytesRead, buffer };
    }
    

    而且,如果您尝试使用handle.read(options) 表单,则会立即抛出对validateBuffer() 的调用。所以,这似乎只是一个错误(在文档或实现中,我不确定是哪个)。在任何情况下,您都只需要切换到 .read() 的另一种形式,您可以分别传递每个参数。

    如果您对此进行更改,您的代码将起作用:

    fileHandler.read({ buffer: dyn_head }).then((bytesRead, buffer) => {
    

    到这里:

    fileHandler.read(dyn_head, 0, dyn_head.length, 0).then(({bytesRead, buffer}) => {
    

    请注意,您还必须更改您的.then(),因为您的论点在那里也有错误。这不是你写的问题的原因,因为你还没有到达那里,但你也必须解决这个问题。


    附:我尝试搜索有关此问题的开放错误报告,但没有找到,尽管我不确定我是否真的知道如何很好地搜索 nodejs 错误。也许你应该提交一份错误报告。

    【讨论】:

    • 是的!天哪,谢谢你弄脏你的手。我也搜索了报告的错误,找不到。我会检查如何报告它,并让团队知道。
    • @branisha - 如果您提交错误,请在此处告诉我,以便我跟踪其进度。我之前提交了一个关于流问题的文件,有趣的是遵循某人修复它的过程,通过测试验证它,然后合并修复。虽然我能够创建错误修复,但我不了解 Github 或处理得足够好,可以实际做所有其他事情(除了编写和测试代码修复)。
    • 我刚刚创建了一个here。实际上,我从未对开放项目进行错误修复。这个应该不复杂,所以我会尝试自己修复它,并尝试熟悉该过程。干杯。
    猜你喜欢
    • 2020-10-29
    • 2019-01-25
    • 1970-01-01
    • 2023-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    相关资源
    最近更新 更多