Вернуть значение из accessSync, отличное от ENOENT - PullRequest
0 голосов
/ 06 декабря 2018

Как бы я возвратил false из accessSync, если не удается найти файл / dir вместо 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 голосов
/ 07 декабря 2018

решение состоит в том, чтобы:

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);
        }
      });   
    });
  },
0 голосов
/ 14 августа 2019

Рассматривайте это как альтернативное решение, чтобы избежать ошибки ENOENT, используя 'child_process' с cat вместо возможностей 'fs', чтобы узнать, существует файл или нет (с реальной ошибкой перехвата, работающей без вмешательства в ваш основной ток)процесс).

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();
0 голосов
/ 06 декабря 2018

Все, что выдает ошибку, может быть помещено в блок 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;
}
...