2014-03-28 5 views
2

У меня есть следующий запрос Получить в сервере ...Node всегда возвращает пустой массив

var imageFiles = []; 
var dir = 'public/img/'; 
fs.readdir(dir, function(err, files){ 
    if (err) return console.error(err); 
    files.forEach(function(file) { 
      file = dir + file; 
      imageFiles.push(file) 
    }); 
}); 
res.send(imageFiles); 
res.end(); 

imageFiles всегда возвращается к angular как empty array. Если я console.log(imageFiles) перед ответом, он также пуст. Однако, если я console.log(files), они все там. Что я делаю не так!?

+1

Вы отправляете ответ до того, как каталог был пройден. readdir ** асинхронно **. Отправьте ответ в обратном вызове. –

+1

Если вы собираетесь использовать NodeJS, вам действительно нужно потратить некоторое время на изучение асинхронного программирования. –

+0

Спасибо @FelixKling. – aedballs

ответ

0

fs.readdir - это асинхронная функция. Он завершается в передающей функции функции обратного вызова.

Итак, когда вы делаете res.send, файлы изображений пустые.

var imageFiles = []; 
... 
fs.readdir(dir, function(err, files){ 
    // files is populated here after readdir returns. 
}); 

// this line executes before readdir returns 
res.send(imageFiles); 

Вам нужно сделать что-то вроде:

var imageFiles = []; 
... 
fs.readdir(dir, function(err, files){ 
    ... 
    res.send(imageFiles); 
    res.end(); 
}); 

Добро пожаловать в асинхронном программировании :)

Checkout async.js. Это помогает распутать обратный вызов ад:

http://www.sebastianseilund.com/nodejs-async-in-practice

+0

Спасибо вам большое! Я знал, что это асинхронно и глупо, потому что я не думаю об этом ... Я постараюсь ответить как можно скорее. – aedballs

+0

np - требуется некоторое время, чтобы привыкнуть. – bryanmac

0

С Array.prototype.forEach блокирует, вы можете просто вызвать ваши другие методы после foreEach заявления. ;

fs.readdir(dir, function(err, files){ 
    if (err) return console.error(err); 
    files.forEach(function(file) { 
      file = dir + file; 
      imageFiles.push(file) 
    }); 
    res.send(imageFiles); 
    res.end(); 
}); 
Смежные вопросы