【问题标题】:fs.open returns 3 rather than bufferfs.open 返回 3 而不是缓冲区
【发布时间】:2026-02-23 20:10:02
【问题描述】:

我是 NodeJs 的新手,但我一直在关注 Udemy 的教程。下面给了他一个来自 open.fs 的缓冲区。它给了我 int 3。

错误:

TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string or an instance of Buffer or URL. Received type number (3)

在错误所在的断点调试变量:

err: null
fd: 3
this: undefined

.

const {promises, open} = require('fs');
const {readFile} = promises


open('./EventEmitter.js', (err, fd) => {
    if (err) {
        console.log(err);
        return;
    }
    readFile(fd, 'utf8')
    .then(data => {
        console.log(data);
    })
    .catch(err => console.log(err))
})

【问题讨论】:

    标签: node.js


    【解决方案1】:

    我认为问题在于fs 的基于承诺的版本和非基于承诺的版本的混合。

    openpromise-based version 返回一个可以与promise-based readFile 一起使用的Buffer:

    const fs = require('fs');
    const {promises} = require('fs');
    const {readFile, open} = promises // <= Using the promise version of `open`
    
    open('./EventEmitter.js').then(fd => {
        readFile(fd, 'utf8')
        .then(data => {
            console.log(data);
        })
        .catch(err => console.log(err))
    })
    

    只有readFilenon-promise version 支持使用文件描述符作为输入。

    【讨论】:

      【解决方案2】:

      大部分代码都不需要,您只需执行以下操作即可获得缓冲区:

      const { readFile } = require('fs');
      
      readFile('./EventEmitter.js', (err, res) => {
          console.log(res); // Returns < Buffer ... >
      })
      

      这是 fs open 的工作版本:

      const {open, read, stat} = require('fs');
      
      stat('script.js', function(err, stats) {
          open('script.js', 'r', function (err, fd) { 
              const buffer = new Buffer(stats.size);
         
           read(fd, buffer, 0, buffer.length, null, function(err, bytes, buff) {
                  const data = buff.toString('utf-8', 0, buff.length);
                  // Here is your data.
              })
          });      
      });
      

      【讨论】: