我想我会在创建自定义http服务器的过程中与其他任何人一起分享这个简单的提示。
我试图使用fs.stat()
来解析fs.readdir()
的结果,识别目录和文件,并将两者分成排序数组以供显示。
不幸的是,因为fs.stat()
是异步的,有时它会在数组完成填充并在res.end()
中写出之前达到res.write()
,并且程序会出错。
所以我尝试使用fs.statSync
作为替代品,并认为它会强制所有其他处理等待它完成:
...
var filesSorted = [];
var dirsSorted = [];
//The "files" variable comes from fs.readdir(), and "url" is
//the path to the directory.
files.forEach(function(file) {
var fileObj = url + file;
fs.statSync(fileObj, function(err, stats) {
if(stats.isDirectory) {
dirsSorted.push({
"dirname" : file,
"creation" : stats['birthtime']
});
} else {
filesSorted.push({
"filename" : file,
"size" : stats['size'],
"creation" : stats['birthtime']
});
}
});
});
...
不幸的是,这不起作用。你不能以这种方式放弃fs.statSync()
。我认为(但不确定)是因为它在其他没有它的异步命令中运行。在res.end()
甚至完成将值推送到数组之前,它始终达到fs.statSync()
。
答案 0 :(得分:0)
经过一段时间的努力,我决定采用不同的方法。我试图将var filesSorted
的输出分配给其父函数内的变量,而不是试图从var dirsSorted
内部推送到fs.statSync()
和fs.statSync()
。在fs.statSync()
完成之前,父函数将无法完成:
var filesSorted = [];
var dirsSorted = [];
files.forEach(function(file) {
var fileObj = url + file;
stats = fs.lstatSync(fileObj);
if(stats.isDirectory()) {
dirsSorted.push({
"dirname" : file,
"creation" : stats['birthtime']
});
} else {
filesSorted.push({
"filename" : file,
"size" : stats['size'],
"creation" : stats['birthtime']
});
}
});
那很有效!对于需要在异步函数内进行同步调用的其他情况,它似乎是有效的。
我希望其他人觉得这很有帮助。