我有一个函数,它采用路径并获取有关它的一些信息(使用 node.js 功能)
代码
import fs from 'fs'
import fse from 'fs-extra'
import { join } from 'path'
/**
* Take in file path and return contents with stat
* @param {String} path
* @return {Array}
*/
export default path => {
return readdir(path).then(files => {
const statsPromises = files.map((file, i) => {
const p = join(path, file)
return stat(p).then(stat =>
({
// THIS ONE LINE BELOW THROWS UN-HANDLED ERRORS FOR SOME PATHS
// Error: EPERM: operation not permitted, scandir
folderItemsCount: stat.isDirectory() ? fs.readdirSync(p).length : null,
name: file,
path: p,
stat
})
, err => console.log("Path access error ", err))
})
return Promise.all(statsPromises)
}).then(contents =>
contents.filter(Boolean)
)
}
// ============== HELPER FUNCTIONS ==============
/**
* Get Array for path contents. Checks if path exists
* @param {String} path
* @return {Promise}
*/
export function readdir (path) {
return pathExists(path)
? fse.readdir(path)
: Promise.reject(new Error('Path does not exist'))
}
/**
* Alias of fse.existsSync
* @param {String} path
* @return {Boolean}
*/
export function pathExists (path) {
return fse.existsSync(path)
}
/**
* Get path stat
* @param {String} path
* @return {Promise}
*/
export function stat (path) {
return fse.stat(path)
}
问题
我不知道如何处理以下行的错误:
folderItemsCount: stat.isDirectory() ? fs.readdirSync(p).length : null
我想要它:
如果可以访问文件夹,则返回多个项目(当它检查可访问的目录时,这确实有效)
如果无法访问文件夹,则返回字符串“未知”(或 null),而不是抛出未处理的错误:
错误:EPERM:不允许操作,scandir
下面的行处理 stat()
但不处理 scandir()
, err => console.log("Path access error ", err))
最佳答案
无需深入研究代码, promise 要么解决,要么拒绝,您的处理程序要么点击“then”,要么点击“catch”。我发现您正在使用 .then,但没有使用 .catch。另请记住,如果该列表中的任何 Promise 被拒绝,则 Promise.all 将拒绝,因此您在那里有一个全有或全无的 Promise。
关于javascript - 无法处理 promise 内的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51117847/