从accessSync返回ENOENT以外的其他值

时间:2018-12-06 17:14:44

标签: node.js asynchronous

当找不到文件/目录而不是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'

3 个答案:

答案 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();