Readstream return 无法处理错误事件,即使它存在

Readstream return cant handle error event even though it is there

这是代码

function read_csv(file_name){
return new Promise((resolve, reject) => {
    let output = []
    fs.createReadStream(file_name)
    .pipe(csv())
    .on('data', (row) => {
        output.push(row)            
    })
    .on('end', () => {
        resolve(output.slice(1))
    })
    .on('error', function(err) {
        reject(err.message)
    });
})

}

即使处理了错误事件,它仍然抛出

events.js:288
  throw er; // Unhandled 'error' event
  ^

  Error: ENOENT: no such file or directory, open 'goodvisit.csv'
  Emitted 'error' event on ReadStream instance at:
  at internal/fs/streams.js:132:12
  at FSReqCallback.oncomplete (fs.js:154:23) {
  errno: -4058,
  code: 'ENOENT',
  syscall: 'open',
  path: 'goodvisit.csv'
  }

我尝试了另一种为 fs.createReadstream 声明变量的方法,虽然它适用于上述情况,但我可以正确获取数据。

在 Node 中,管道不会将错误转发到下一个管道。因此,您需要将处理程序附加到 fs,因为没有您正在尝试读取的文件。

fs.createReadStream(file_name).on('error', err => console.log(err))
    .pipe(csv())
    .on('data', (row) => {
        output.push(row)            
    })
    .on('end', () => {
        resolve(output.slice(1))
    })
    .on('error', function(err) {
        reject(err.message)
    });

    fs

您可以查看 this link 了解更多详细信息,当我们多次通过管道传输我们的流时如何处理错误。

如果这不起作用,您可以使用 multipipe 组合多个流并在一处处理错误。

const pipe = require('multipipe')

// pipe multiple streams like A, B and C
const stream = pipe(A, B, C) 


// centralized error handling
stream.on('error', fn)