2017-06-20 120 views
0

我想在我的node.js服务器上简单地提供静态文件。如果url栏中的路径链接到一个静态文件,我可以轻松地做到这一点。然而,如果即时通讯尝试列出目录内容,我需要使用node.js文件系统调用。我可以列出目录内容,但我想浏览每个级别并根据需要获取内容。 类似于apache的默认功能如果目录里面没有'index.html',它会列出所有的内容。如果在node.js中指定了目录路径,则列出目录内容

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> 

此代码工作,但我需要解决遍历另一个目录更深的路径。再次呼叫我的功能。我可以通过一个帖子请求解决这个问题,但我觉得这已经变得太复杂了...... 有什么建议吗?

+0

你为什么试图重新发明轮子? https://www.npmjs.com/package/express-directory –

+0

我最终使用了服务静态中间件。它解决了我的问题。 –

回答

0

如果指定的路径是目录,则使用静态中间件服务我自己的自定义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}); 
});