当找不到文件/目录而不是false
时,如何从accessSync
返回ENOENT
?
单元测试
it.only('should be able to read a file stream only if a file exist', function() {
let testfile = testpath+'/imageeee.png';
let ok = FileService.existsAsync(testfile);
ok = ok.then((result) => {
console.log('exists: ', result);
return FileService.createReadStream(testfile);
});
ok = ok.then((result) => {
assert.isNotNull(result.path);
assert.equal(result.path, testfile);
assert.isTrue(result.readable, true);
});
return ok;
});
功能
existsAsync(path) {
let ok = fs.accessAsync(path, fs.F_OK);
ok = ok.then(function(error) {
if (error) {
return false;
} else {
return true;
}
});
return ok;
},
错误
Error: ENOENT: no such file or directory, access '/home/j/Work/imageeee.png'
答案 0 :(得分:0)
任何引发错误的内容都可以包装在try ... catch块中,以捕获错误并从此处继续。如果这是这里的问题功能:
fs.accessAsync(path, fs.F_OK);
将其包装在try catch中,并在错误情况下返回false:
try {
fs.accessAsync(path, fs.F_OK);
// ... other code
return true;
} catch(e) {
// log the error ?
return false;
}
答案 1 :(得分:-1)
解决方案是:
1)推广调用accessAsync的方法
2)resolve
错误,而不是拒绝错误
如果结果为false
,这仍然会返回错误,但不会破坏承诺链。为了返回false
,您可以简单地执行resolve(false)
,但我发现实际返回错误并在测试中处理它更为有用。
修改后的代码:
existsAsync(path) {
return new Promise((resolve, reject) => {
return fs.accessAsync(path, fs.F_OK, (err, data) => {
if (err) {
resolve(err);
} else {
resolve(true);
}
});
});
},
答案 2 :(得分:-1)
将此作为解决方案的另一种解决方案,可通过将cat的“ child_process”与cat一起使用来避免ENOENT错误,而不是使用fs功能来了解文件是否存在(实际的catch错误异常在不干扰您的主电流的情况下起作用过程)。
const { exec } = require('child_process');
function is_file(path){
return new Promise(resolve => {
try {
exec(`cat ${path}`, (err, stdout, stderr) => { // cat required
if (err) {
resolve(false);
} else {
resolve(true);
}
});
} catch ( e ) { resolve(false); }
});
}
async function main(){
let file = `foo.txt`;
if ( (await is_file(file)) ) {
console.log(`file exists: ${file}`);
} else {
console.log(`no such file: ${file}`);
}
}
main();