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

Node.js 如何使用Express获取目录内容?,node.js,express,Node.js,Express,我尝试从目录中获取所有文件(名称)。我使用Node.js+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(__dir

我尝试从目录中获取所有文件(名称)。我使用
Node.js
+
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;
var express=require('express');
var fs=需要('fs');
var path=require('path');
var router=express.router();
router.get('/',函数(req,res){
var filePath=path.join(path.resolve(uu dirname,“…”),“/public/images/”);
var directoryContent=[];
getDirectoryContent(文件路径,directoryContent);
res.send(目录内容);
});
函数getDirectoryContent(dir,arr){
fs.readdir(dir,function(err,flist){
如果(错误){
返回;
}
变量元素=0;
var processEntry=函数(条目){
arr.push(进入);
//控制台日志(条目);
};
var dirIterator=函数(){
processEntry(flist[elemNum]);
元素++;
if(元素<起始长度){
process.nextTick(dirIterator);
}
};
if(元素<起始长度){
process.nextTick(dirIterator);
}
});
}
module.exports=路由器;
但结果是[]-空数组。我做错了什么

PS


我们发现问题出在回调机制中。Bit I可能是错误的。

您不尊重目录读取操作的异步性质。
fs.readdir
是异步的,将“最终”导致调用您的处理函数,因此您必须告诉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;
  • 您可以捕获一次路径。它永远不会改变
  • 使该函数成为一个适当的中间件函数:req/res/next-go-in,出错时调用next(err),正常时调用next()
  • 当阅读目录出错时,事情就会出错
  • 当我们可以阅读目录时,事情就顺利了。API告诉我们“结果”是一个文件名数组。我们将这些存储在
    res.locals
    上,然后告诉express转到路由中的下一个中间件函数
  • 当我们到达最后一个函数时(在本例中是两个函数组成的光荣链,但在一个实际应用程序中,该链很容易是10个或更多操作,每个操作一个函数),我们使用
    res.locals.filenames
    ,生成一个结果,我们知道它存在,因为否则我们不会到达路由处理的这一部分,下一个(错误)将发生,express将把我们移到错误处理程序

  • 问题在于
    fs.readdir
    方法是一个异步操作。实际上,您必须向该方法传递回调函数,并等待操作执行

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

    您可以使用
    fs.readdirSync
    开关进行同步操作。结果是一个文件数组(如果有)。如果发生错误,它将被抛出,因此您需要在函数中捕获错误

    router.get('/',函数(req,res){
    var filePath=path.join(path.resolve(uu dirname,“…”),“/public/images/”);
    试一试{
    var directoryContent=fs.readdirSync(filePath);
    res.send(目录内容);
    }捕获(e){
    其次(e);
    }
    });