如果在 node.js 中指定了目录路径,则列出目录内容

list directory contents if directory path is specified in node.js

我试图在我的 node.js 服务器上简单地提供静态文件。如果 url 栏中的路径链接到静态文件,我可以很容易地做到这一点。但是,如果我试图列出目录内容,我需要使用 node.js 文件系统调用。我能够列出目录内容,但我想导航每个级别并根据需要获取内容。 类似于 apache 的默认功能,如果目录中没有 'index.html',它将列出所有内容。

apache list directory contents

我如何制作一个简单的 html 页面来列出目录内容,并且可以点击以导航和提供服务?

具体来说,我有一个要访问的日志文件夹。该文件夹内是子目录,以及散落的各种日志。

这是我到目前为止所尝试过的。

//inside server.js
// serve any static file inside my logs folder
app.use('/logs', express.static('logs'));

// routes.js
var logger = require('../controllers/s3logs');

app.get('/listlogs', function (req, res) {
        res.render('logpage', {logList : logger.findFiles()} );
    });

// controller s3logs.js
exports.findFiles = function(path)
exports.findFiles = function (path) {

if (path==undefined)
{
    path='logs';
}

var fileArray = fs.readdirSync(path); //get array of objects inside root dir
var fileObjArray = [];


// iterate through each file found in the directory
// find stats, make an obj, and push to new array

fileArray.forEach(function(item, index){
    const pathToItem =    path+'/'+item ;
    const stats = fs.statSync(pathToItem);

    var fileObj = {
        "name": item,
        "path": pathToItem,
        "isDir": stats.isDirectory(),
        "size": stats.size,
        "modified": stats.mtime
    };

    fileObjArray.push(fileObj);

    });

return fileObjArray;
};

//logpage.html
<body>
<ul>
    {% for file in loglist %}
    <li {% if loop.first %} class="first"{% endif %}>
        <a href= {{ file.path }}>{{ file.name }}</a>
    </li>
    {% endfor %}
</ul>
</body>

此代码有效,但我需要解析路径以更深入地遍历另一个目录。再次调用我的函数。我可以通过 post 请求解决这个问题,但我觉得这已经变得太复杂了...... 有什么建议吗?

如果指定的路径是目录,则使用服务静态中间件来服务我自己的自定义 html。

var serveStatic = require('serve-static');


// serve static logs files
var serve = serveStatic('logs');

app.use('/logs', serve, function (req, res) {
    // console.log(req)
    res.render('logpage', {logList:s3logger.findFiles(req.originalUrl), currentPath: req.originalUrl} );
});