如何使用Express获取目录内容?

我尝试从目录中获取所有文件(名称)。 我使用Node.js + Express 。 这是我的Express代码:

 var express = require('express'); var fs = require('fs'); var path = require('path'); var router = express.Router(); router.get('/', function (req, res) { var filePath = path.join(path.resolve(__dirname, '..'), '/public/images/'); var directoryContent = []; getDirectoryContent(filePath, directoryContent); res.send(directoryContent); }); function getDirectoryContent(dir, arr) { fs.readdir(dir, function (err, flist) { if (err) { return; } var elemNum = 0; var processEntry = function (entry) { arr.push(entry); //console.log(entry); }; var dirIterator = function () { processEntry(flist[elemNum]); elemNum++; if (elemNum < flist.length) { process.nextTick(dirIterator); } }; if (elemNum < flist.length) { process.nextTick(dirIterator); } }); } module.exports = router; 

但结果是[] – 空数组。 我做错了什么?

PS

接下来的问题是在callback机制中。 我可能是错的。

您不尊重该目录读取操作的asynchronous性质。 fs.readdir是asynchronous的,并且将“最终”导致你的处理函数被调用,所以你将不得不告诉Node.js,当它发生时需要恢复它的工作:

 var express = require('express'); var router = express.Router(); var fs = require('fs'); var path = require('path'); var imagePath = path.join(path.resolve(__dirname, '..'), '/public/images/'); function getDirectoryContent(req, res, next) { fs.readdir(imagePath , function (err, images) { if (err) { return next(err); } res.locals.filenames = images; next(); }); } router.get('/', getDirectoryContent, function(req, res) { // build a response using res.locals.filenames here. // just sending the names is silly, and so for demonstration only res.send(res.locals.filenames); }); module.exports = router; 
  1. 你可以捕捉一次path。 它永远不会改变。
  2. 使函数得到该dir列出一个适当的中间件函数:req / res / next进入,下一个(err)在出错时调用,next()在事情正确时调用
    1. 阅读目录时出错了
    2. 当我们可以读取目录时,事情就会变得正确。 API告诉我们'结果'是一个文件名数组。 我们将这些存储在res.locals ,然后告诉express转到路由中的下一个中间件function。
  3. 当我们到达最后一个函数时(在这种情况下,在两个函数的光荣链中,但是在一个真正的应用程序中,链可以容易地是每个操作具有一个函数的10个或更多个操作),我们使用res.locals.filenames我们知道存在,因为否则我们不会到达这部分路由处理,下一个(err)会发生,并且express会把我们移到我们的error handling程序中。

问题是fs.readdir方法是一个asynchronous操作。 您实际上必须将callback函数传递给该方法,并等待该操作被执行。

现在它是空的,因为你在操作完成之前刷新响应。

您可以使用fs.readdirSync巫婆是一个同步操作。 结果是一个文件数组,如果有的话。 如果发生错误,它将被抛出,所以你需要捕捉你的函数内的错误。

 router.get('/', function (req, res) { var filePath = path.join(path.resolve(__dirname, '..'), '/public/images/'); try { var directoryContent = fs.readdirSync(filePath); res.send(directoryContent); } catch(e) { next(e); } });