列出服务器上的静态内容并使用 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
使用 sendFile() 在 Express 中发送静态文件