我在NodeJS中迈出了第一步,我遇到了async-module的问题。我有以下代码可以正常工作:
{"error":null,"data":{"albums":["testdir1","testdir2"]}}
这样可以正常工作,并提供预期的输出:
function load_albums(callback) {
fs.readdir("albums", function(err, content) {
console.log(content);
if(err) {
callback(err);
return;
}
var directories = [];
async.each(content, function(item, callback2) {
fs.stat("albums/" + item, function(err,stats) {
if(stats.isDirectory()) {
directories.push(item);
}
callback2();
});
});
callback(null, directories);
});
}
但是,我打算用async.each函数替换迭代器。
我最终得到了这个:
{"error":null,"data":{"albums":[]}}
然而,这似乎不起作用,因为“专辑”现在似乎是空的:
{{1}}
我在这里缺少什么?我想它与调用fs.stats()函数有关,但我不确定我做错了什么。
答案 0 :(得分:1)
async.each()
有三个参数。你没有传递最后一个告诉你何时完成的那个。您还没有在fs.stat()
上实现错误处理。你可以改为:
function load_albums(callback) {
fs.readdir("albums", function(err, content) {
console.log(content);
if(err) {
callback(err);
return;
}
var directories = [];
async.each(content, function(item, callback2) {
fs.stat("albums/" + item, function(err,stats) {
if (!err && stats.isDirectory()) {
directories.push(item);
}
callback2(err);
});
}, function(err) {
callback(err, directories);
});
});
}
答案 1 :(得分:1)
@ jfriend00回答最终回调是asyn.each
的第三个参数。目前,此回调正在运行,无需等待async.each
完成。
此外,您还要为所有请求提供相册。它们应该在特定资源网址上投放,例如/albums
或/albums/
我对代码进行了这些修改,现在它会在http://localhost:8080/albums
上加载相册,否则会返回“No Content
。
var http = require('http');
var fs = require('fs');
var async = require('async');
function load_albums(loadCompleteCallback) {
fs.readdir("albums", function(err, content) {
console.log(content);
if(err) {
callback(err);
return;
}
var directories = [];
async.each(content, function(item, doneCallback) {
fs.stat("albums/" + item, function(err,stats) {
if(stats.isDirectory()) {
directories.push(item);
}
return doneCallback(err);
});
}
, function (err) {
loadCompleteCallback(err, directories);
});
});
}
function handle_request(request, response) {
console.log("requested path: " + request.url);
if(request.url.match(/^\/albums[\/]?$/) ) {
load_albums(function(err, albums) {
if (err) {
response.writeHead(503, {"Content-Type": "application/json"});
response.end(JSON.stringify(err) + "\n");
return;
}
var out = { error: null,
data: { albums: albums}};
response.writeHead(200, { "Content-Type" : "application/json" });
response.end(JSON.stringify(out) + "\n");
});
} else {
response.writeHead(200, { "Content-Type" : "application/json" });
response.end("No Content\n");
}
}
var s = http.createServer(handle_request);
s.listen(8080);
console.log("server running at : http://localhost:" + 8080);