Node JS:如果在 Promise.all 上读取多个文件,如何在读取文件时捕获单个错误?

Node JS: How to catch the individual errors while reading files, in case multiple files are read on Promise.all?

我有 10 个不同的文件,我需要读取它们的内容并将其合并到一个对象中(在 NodeJS 中)。我用下面的代码成功地做到了这一点:

const fs = require('fs');
const path = require('path');
const { promisify } = require("util");    
const readFileAsync = promisify(fs.readFile);

let filePathArray = ['path/to/file/one', ... , 'path/to/file/ten'];
Promise.all(
  filePathArray.map(filePath => {          
    return readFileAsync(filePath);
  })
).then(responses => { //array of 10 reponses
  let combinedFileContent = {};
    responses.forEach((itemFileContent, index) => {
      let tempContent = JSON.parse(itemFileContent);
      //merge tempContent into combinedFileContent 
    }
});

但我想知道的是,如果在尝试读取文件时出现错误,如何捕获?读取单个文件时,其工作方式如下:

fs.readFile(singleFilePath, (singleFileErr, singleFileContent) => {
  if (singleFileErr) {
    //do something on error, while trying to read the file        
  }
});

所以我的问题是,如何访问第一个代码片段中的错误客栈,它对应于第二个代码片段中的 singleFileErr? 我面临的问题是:如果某些文件不存在,我想检查错误并跳过该文件,但是由于我无法检测到当前实现的错误,所以我的整个块崩溃了,我无法因为这个而合并其他 9 个文件。我想使用我在第二个片段中提到的错误检查。

查看 Promise.allSettled 函数,它会 运行 每 Promise 传递给它,最后会告诉你哪些成功了,哪些失败了。

也许试试这样的事情:

  • map() 回调中,return 如果未找到文件,则解析为 null 的承诺。
  • 在过滤掉 null 响应的承诺链中引入一个中间阶段。

这看起来像这样:

Promise.all(
  filePathArray.map(filePath => {          
    return readFileAsync(filePath).catch(function(error){
      if(isErrorFileDoesNotExist(error)) return null
      throw error;
    })
  });
).then(responses => {
   return responses.filter(response => response != null) 
})
.then(filteredResponses => { 
  // .. do something
});

这对你有用吗?请注意,这假定您实际上能够区分丢失文件错误和其他错误,readFileAsync() 编辑的承诺 return 可能会拒绝 - 大概是通过此代码段中的 isErrorFileDoesNotExist() 函数。