我使用了一种相当丑陋的方法:
var app = require('express')(),
server = require('http').createServer(app),
fs = require('fs');
server.listen(80);
path = "/Users/my/path/";
var served_files = {};
["myfile1.html","myfile2.html","myfile3.html"].forEach(function(file){
served_files["/"+file] = fs.readFileSync(path+file,"utf8");
});
app.use(function(req,res){
if (served_files[req.path])
res.send(files[req.path]);
});
做正确的方法是什么?
答案 0 :(得分:18)
Express有一个内置的中间件。它是connect的一部分,表达的基础是。中间件本身使用send。
// just add the middleware to your app stack via `use`
app.use(express.static(yourpath));
在回答您的评论时,不,没有办法手动选择文件。虽然默认情况下中间件会忽略前缀为.
的文件夹,但例如,不会提供名为.hidden
的文件夹。
要手动隐藏文件或文件夹,您可以在static
之前插入自己的中间件,以在请求到达之前过滤掉路径。以下内容将阻止从名为hidden
的文件夹中提供任何文件:
app.use(function(req, res, next) {
if (/\/hidden\/*/.test(req.path)) {
return res.send(404, "Not Found"); // or 403, etc
};
next();
});
app.use(express.static(__dirname+"/public"));
答案 1 :(得分:12)
如果您想在不使用Express的情况下获得解决方案(正如您明确要求的那样“简单”),请查看node-static模块。
它允许您像Express的相应中间件一样提供文件夹,但它也允许您只提供特定文件。
在最简单的情况下,它只是:
var http = require('http'),
static = require('node-static');
var folder = new(static.Server)('./foo');
http.createServer(function (req, res) {
req.addListener('end', function () {
folder.serve(req, res);
});
}).listen(3000);
如果您需要一些示例,请查看GitHub项目页面,其中有几个。
PS:您甚至可以全局安装node-static并将其用作CLI工具,只需从您希望服务的文件夹中的shell运行它:
$ static
就是这样: - )!
PPS:关于你原来的例子,在这里使用带有流的管道更好,而不是以同步的方式加载所有文件。
答案 2 :(得分:5)
答案 3 :(得分:2)
我个人更喜欢从nginx服务器文件(我也用它来进行gzip编码,缓存,SSL处理和负载平衡),而node只提供API。也许不是你正在寻找的答案,但它提供了有趣的选择。也许你可以看看这种方法并发现你喜欢它;)
答案 4 :(得分:1)
如果您想要一种非常简单的方式,那么我想向您展示我的模块(它不仅适用于静态文件)simpleS,请使用npm install simples
进行安装。
将所有文件放在一个文件夹中,例如files
。
这是魔术:
var simples = require('simples');
var server = simples(80);
server.serve('files');
/* if you want to catch the acces to a folder and to do something, try this:
server.serve('files', function (connection, files) {
// Your application logic
// For example show the files of the folder
});
*/
您无需关心文件的内容类型,它会自动从文件扩展名中检测到它
答案 5 :(得分:1)
我对AUTO-INCLUDE索引html中的文件进行了以下更改。因此,当您在文件夹中添加文件时,它将自动从文件夹中获取,而无需您在index.html中包含该文件
//// THIS WORKS FOR ME
///// in app.js or server.js
var app = express();
app.use("/", express.static(__dirname));
var fs = require("fs"),
function getFiles (dir, files_){
files_ = files_ || [];
var files = fs.readdirSync(dir);
for (var i in files){
var name = dir + '/' + files[i];
if (fs.statSync(name).isDirectory()){
getFiles(name, files_);
} else {
files_.push(name);
}
}
return files_;
}
//// send the files in js folder as variable/array
ejs = require('ejs');
res.render('index', {
'something':'something'...........
jsfiles: jsfiles,
});
///--------------------------------------------------
///////// in views/index.ejs --- the below code will list the files in index.ejs
<% for(var i=0; i < jsfiles.length; i++) { %>
<script src="<%= jsfiles[i] %>"></script>
<% } %>