节点始终返回空数组

3
我在服务器中有以下的Get请求...
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();

angular中,imageFiles总是返回空数组。如果在响应之前console.log(imageFiles),它也是空的。但是,如果console.log(files),它们都在那里。我做错了什么!?


1
在遍历目录之前就发送了响应。readdir是异步的。请在回调函数中发送响应。 - Felix Kling
1
如果你要使用NodeJS,你真的需要花些时间学习异步编程。 - cookie monster
2个回答

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();
});

欢迎来到异步编程 :)

请尝试使用 async.js。它有助于解决回调地狱的问题:

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


非常感谢!我知道这是异步的,感觉自己很愚蠢没有想到... 我会尽快将其标记为答案。 - aedballs
np - 需要一些时间来适应。 - bryanmac

0

由于Array.prototype.forEach是阻塞的,因此您可以在forEach语句之后直接调用其他方法。

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();
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接