node.js 回调 http 服务器读取目录
node.js callbacks http server read dir
菜鸟有一些问题,无法使脚本显示文件列表,我认为是关于 walk is async,但我在错误中没有任何帮助。
此致,
马塞洛
// ---- listFiles.js -----------------------------------------------------------
exports.walk = function(currentDirPath, extension, callback) {
var fs = require('fs');
var regex = new RegExp( extension + '$', 'g' );
fs.readdir( currentDirPath, function (err, files) {
if (err) callback(err);
files.filter(function(fname){
if(fname.match(regex)) {
callback(null, fname);
}
})
});
console.log("Fired callback.");
}
// walk('.', 'js', function(err, file){ console.log(file); }); runs OK
// ---- listfilesTest.js --------------------------------------------------------
var http = require('http');
var content = require('./listFiles');
var args = process.argv.slice(2);
console.log(args); // command line arguments (dir & extension)
http.createServer(function (req, res) {
var files = [];
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write('-- list of files --\n');
content.walk(args[0], args[1], function(err, data){
if(err) console.error(err);
//console.log(data);
res.write(data); // not printing the dir Listings
} );
res.end();
}).listen(9000);
// nodemon listFilesTest.js '.' 'js'
您在任何 res.write()
语句执行之前调用 res.end()
。 content.walk()
的回调是异步的,这意味着它会在未来某个不确定的时间发生。
您需要在所有 res.write()
语句完成后调用 res.end()
。 exports.walk()
的结构方式,调用者无法知道何时完成列出文件和调用回调,因此必须对其进行重组以指示何时完成。
有很多可能的方法来构建它。一种相当简单的方法是在列表完成时向回调添加一个参数。
// ---- listFiles.js -----------------------------------------------------------
exports.walk = function(currentDirPath, extension, callback) {
var fs = require('fs');
var regex = new RegExp( extension + '$', 'g' );
fs.readdir( currentDirPath, function (err, files) {
if (err) callback(err);
files.filter(function(fname){
if(fname.match(regex)) {
// call the callback with this filename, not done yet
callback(null, false, fname);
}
})
// signal that we are done listing the files
callback(null, true);
console.log("Done listing files.");
});
}
// walk('.', 'js', function(err, done, file){ console.log(file); }); runs OK
// ---- listfilesTest.js --------------------------------------------------------
var http = require('http');
var content = require('./listFiles');
var args = process.argv.slice(2);
console.log(args); // command line arguments (dir & extension)
http.createServer(function (req, res) {
var files = [];
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write('-- list of files --\n');
content.walk(args[0], args[1], function(err, done, data){
if(err) {
console.error(err);
return;
}
if (done) {
res.end();
} else {
//console.log(data);
res.write(data); // not printing the dir Listings
}
});
}).listen(9000);
菜鸟有一些问题,无法使脚本显示文件列表,我认为是关于 walk is async,但我在错误中没有任何帮助。
此致, 马塞洛
// ---- listFiles.js -----------------------------------------------------------
exports.walk = function(currentDirPath, extension, callback) {
var fs = require('fs');
var regex = new RegExp( extension + '$', 'g' );
fs.readdir( currentDirPath, function (err, files) {
if (err) callback(err);
files.filter(function(fname){
if(fname.match(regex)) {
callback(null, fname);
}
})
});
console.log("Fired callback.");
}
// walk('.', 'js', function(err, file){ console.log(file); }); runs OK
// ---- listfilesTest.js --------------------------------------------------------
var http = require('http');
var content = require('./listFiles');
var args = process.argv.slice(2);
console.log(args); // command line arguments (dir & extension)
http.createServer(function (req, res) {
var files = [];
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write('-- list of files --\n');
content.walk(args[0], args[1], function(err, data){
if(err) console.error(err);
//console.log(data);
res.write(data); // not printing the dir Listings
} );
res.end();
}).listen(9000);
// nodemon listFilesTest.js '.' 'js'
您在任何 res.write()
语句执行之前调用 res.end()
。 content.walk()
的回调是异步的,这意味着它会在未来某个不确定的时间发生。
您需要在所有 res.write()
语句完成后调用 res.end()
。 exports.walk()
的结构方式,调用者无法知道何时完成列出文件和调用回调,因此必须对其进行重组以指示何时完成。
有很多可能的方法来构建它。一种相当简单的方法是在列表完成时向回调添加一个参数。
// ---- listFiles.js -----------------------------------------------------------
exports.walk = function(currentDirPath, extension, callback) {
var fs = require('fs');
var regex = new RegExp( extension + '$', 'g' );
fs.readdir( currentDirPath, function (err, files) {
if (err) callback(err);
files.filter(function(fname){
if(fname.match(regex)) {
// call the callback with this filename, not done yet
callback(null, false, fname);
}
})
// signal that we are done listing the files
callback(null, true);
console.log("Done listing files.");
});
}
// walk('.', 'js', function(err, done, file){ console.log(file); }); runs OK
// ---- listfilesTest.js --------------------------------------------------------
var http = require('http');
var content = require('./listFiles');
var args = process.argv.slice(2);
console.log(args); // command line arguments (dir & extension)
http.createServer(function (req, res) {
var files = [];
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write('-- list of files --\n');
content.walk(args[0], args[1], function(err, done, data){
if(err) {
console.error(err);
return;
}
if (done) {
res.end();
} else {
//console.log(data);
res.write(data); // not printing the dir Listings
}
});
}).listen(9000);