13

我正在使用一种相当丑陋的方法:

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]);
});

正确的方法是什么?

4

6 回答 6

18

Express 有一个内置的中间件。它是connect的一部分, express 是建立在它之上的。中间件本身使用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"));
于 2013-01-29T06:08:03.350 回答
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:关于您的原始示例,最好在此处使用带有流的管道,而不是以同步方式加载所有文件。

于 2013-01-29T06:13:44.617 回答
5

正如这个问题的公认答案中提到的,我建议使用http-server

它可以通过命令行启动,无需任何配置

cd /path/to/directory
http-server
于 2013-11-05T22:47:25.343 回答
2

就我个人而言,我更喜欢来自 nginx 的服务器文件(我也将它用于 gzip 编码、缓存、SSL 处理和负载平衡),并且节点只提供 API。也许不是您正在寻找的答案,但它提供了有趣的选择。也许您可以看看这种方法并发现您喜欢它;)

于 2013-11-06T09:52:20.093 回答
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
});
*/

您不需要关心文件的内容类型,它会自动从文件扩展名中检测到它

于 2013-01-29T15:52:25.360 回答
1

我对索引 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>
<% } %>
于 2016-04-26T06:42:33.767 回答