2015-06-27 2 views
0

Я выполняю упражнения learnyounode. В этой функции я перечисляю каталог и файлы фильтров по расширению. Как я понимаю, если я укажу недопустимое имя каталога, он должен перейти в пункт if и выйти. Но вместо этого он переходит к предложению if, а затем жалуется на что-то в предложении else.Почему в этом фрагменте кода узла работает оператор else?

Модуль:

module.exports = function (path, ext, callb) { 
    var fs = require('fs'); 
    var elems = []; 
    var r = new RegExp("\\." + ext); 
    fs.readdir(path, function (err, list) { 
     console.log(err); // this runs, it's an object like { [Error: ENOENT, scandir '/Users/JohnnyLee/baobabf/ 
     console.log(list); // this also runs, it's undefined 
     if (err) { 
      console.log("ERR!!!"); // this ran! 
      return callb(err); 
     } else { 
      console.log("NO ERRR!!!"); // this didn't run :/ 
      list.forEach(function (i) { // this crashes? 
       if (i.match(r)) { 
        elems.push(i); 
       } 
      }); 
      return callb(err, elems); 
     } 
     console.log(list); 
    }); 
}; 

Исполняемые:

var mymod = require('./p06-1'); 
var filename = process.argv[2] 
var extension = process.argv[3] 

if (filename && extension) { 
    mymod(filename, extension, function (err, list) { 
     list.forEach(function (i) { 
      console.log(i); 
     }); 
    }) 
} 

Выход:

triton:learnnode JohnnyLee$ node p06-2.js doesntexist txt 
{ [Error: ENOENT, scandir 'doesntexist'] errno: -2, code: 'ENOENT', path: 'doesntexist' } 
undefined 
ERR!!! 
/Users/JohnnyLee/learnnode/p06-2.js:7 
     list.forEach(function (i) { 
      ^
TypeError: Cannot read property 'forEach' of undefined 
    at /Users/JohnnyLee/learnnode/p06-2.js:7:13 
    at /Users/JohnnyLee/learnnode/p06-1.js:11:20 
    at FSReqWrap.oncomplete (fs.js:95:15) 
triton:learnnode JohnnyLee$ 

Что я пропустил :(

ответ

4

Вы называете его:

mymod(filename, extension, function (err, list) { 
    list.forEach(function (i) { 
     console.log(i); 
    }); 
}) 

Это ошибки list.forEach. Посмотрите на имя файла/номер строки для ошибки. Это связано с тем, что вы вызываете callb(err) в модуле, но вы не проверяете наличие ошибки, прежде чем считать, что есть list.

+0

Спасибо! > Может быть, мне плохой день не понять. – jleeothon

0

Пожалуйста, проверьте стек ошибок должным образом, это громко и ясно :)

Что касается Вашего вопроса о том, что вы пропустили,

Добавить проверку заявления об ошибке для обработки ошибок. Изменить mymod вызов, как показано ниже,

if (filename && extension) { 
    mymod(filename, extension, function (err, list) { 
     if(err){ 
       //do something with error 
      }else{ 
     list.forEach(function (i) { 
      console.log(i); 
       } 
     }); 
    }) 
}