列出服务器上的静态内容并使用 Express 将其作为 JSON 返回

Posted

技术标签:

【中文标题】列出服务器上的静态内容并使用 Express 将其作为 JSON 返回【英文标题】:List static content on server and return it as JSON using Express 【发布时间】:2015-08-25 10:56:34 【问题描述】:

我有一个非常简单的应用程序提供静态文件:

var express = require('express');
var app = express();
app.use(express.static(__dirname + '/files'));
app.listen(process.env.PORT || 8080);

我想通过响应文件夹的 GET 来让这个应用更智能一些。我的意思是,以 JSON 格式列出文件夹的完整文件列表

例如,对于localhost:8080/ 的 GET,我希望应用返回:

[
  "type" : "file",
  "name" : "file1.ext"
,

  "type" : "file",
  "name" : "file2.ext"
,

  "type" : "dir",
  "name" : "a-folder"
]

代替:

Cannot GET /

有没有办法扩展 Express 的静态行为来实现这一点? 如果没有,您会推荐什么方法?

编辑:我尝试使用 serve-index 中间件(以前的 directory),它运行良好,但不幸的是,当我需要原始 JSON 时直接返回 html

【问题讨论】:

【参考方案1】:

如http://expressjs.com/starter/static-files.html中所说

你需要使用 express.static:

var express = require('express');
var app = express();
app.use("/files",express.static('files'));
app.listen(process.env.PORT || 8080);

然后您将能够以以下方式访问文件:

http://yourdomain.com/files/file.jpg

编辑我刚刚意识到,您需要目录中的文件列表。

你有一个 API 可以做到这一点:https://github.com/expressjs/serve-index

另外,Express 中有一个目录选项:https://***.com/a/6524266/3617531

你有答案,然后,我会标记为重复

正如here 所评论的那样,可能会安装节点实用程序 glob (npm install glob),并以这种方式在 /files 目录中为 GET 编写一些快速函数:

var express = require('express');
var app = express();
var glob = require("glob")


//EDIT: As you commented, you should add this also here, to allow 
//  accessing the files inside the dir. It should not be a problem as 
//  GET only manages the requests to "/files" url, without a file name    
//  after it.

app.use("/files", express.static("/files"));

app.get('/files', function (req, res) 

//EDIT: USE WALK INSTEAD OF WALK TO GO UNDER CHILD DIRS
glob("*.ext", options, function (er, files) 
  // files is an array of filenames.
  // If the `nonull` option is set, and nothing
  // was found, then files is ["**/*.js"]
  // er is an error object or null.
  res.send(files);
);


);

var server = app.listen(8080, function () 

  var host = server.address().address;
  var port = server.address().port;

  console.log('Example app listening at http://%s:%s', host, port);

);

步行模式:(用于子目录,根据需要)

var express = require('express');
var app = express();
var walk    = require('walk');
var ALLfiles   = [];

app.use("/files", express.static("/files"));

app.get('/files', function (req, res) 

//EDIT: If you need to go under subdirs: change glob to walk as said in https://***.com/questions/2727167/getting-all-filenames-in-a-directory-with-node-js/25580289#25580289
  var walker  = walk.walk('./files',  followLinks: false );
   walker.on('file', function(root, stat, next) 
       // Add this file to the list of files
       ALLfiles.push(root + '/' + stat.name);
       next();
   );

   walker.on('end', function() 
    res.send(ALLfiles);
   );

);

var server = app.listen(8080, function () 

  var host = server.address().address;
  var port = server.address().port;

  console.log('Example app listening at http://%s:%s', host, port);

);

【讨论】:

谢谢亚历杭德罗。我试过这个,但是当我需要 JSON 时,这个中间件会返回 HTML ......有什么建议吗? 你仍然需要一些编码,但我认为这将是一种简单的方法,也许你还需要对数组进行 JSON 编码,但我认为你会很容易地完成它 感谢您的更新。最后一个问题:在此解决方案中,不再提供文件本身。此代码与app.use(express.static("files")) 兼容吗?我希望像if(isFile(file)) serveStaticFile(file) else serveFolderAsJSON(file) 这样的逻辑。 我认为像这样组合它们不会有任何问题*** *请检查我现在所做的答案编辑 **不太确定,但可以肯定的是,如果它不起作用,您可以将 use 仅限制为“/files/”或类似的

以上是关于列出服务器上的静态内容并使用 Express 将其作为 JSON 返回的主要内容,如果未能解决你的问题,请参考以下文章

如何将授权标头添加到用户请求并使用 express 将其代理到另一个服务器 api

Express框架

姜戈。列出静态文件夹中的文件

使用 sendFile() 在 Express 中发送静态文件

Android 上的 J7zip - 从存档中提取并列出内容

下载Ajax响应作为zip文件?