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()
函数。
我有 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()
函数。