Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用express服务静态文件的最简单方法是什么?_Javascript_Node.js_Express - Fatal编程技术网

Javascript 使用express服务静态文件的最简单方法是什么?

Javascript 使用express服务静态文件的最简单方法是什么?,javascript,node.js,express,Javascript,Node.js,Express,我使用了一种相当丑陋的方法: 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(functi

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

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

正确的方法是什么?

Express为此提供了内置中间件。它是express的一部分。中间件本身使用

对于您的评论,没有,没有办法手动选择文件。虽然默认情况下,中间件将忽略前缀为的文件夹,因此,例如,名为.hidden的文件夹将不会提供服务

要手动隐藏文件或文件夹,可以在静态之前插入自己的中间件,以便在请求到达之前过滤出路径。以下内容将阻止从名为hidden的文件夹中提供任何文件:


如果您希望有一个解决方案,而不使用显式要求的Express,请查看模块

它允许您像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:关于您最初的示例,在这里使用流管道比以同步方式加载所有文件要好得多。

如果您想要一种非常简单的方法,那么我想向您展示我的模块,它不仅适用于静态文件,还可以使用npm install simples进行安装

将所有文件放在文件夹中,例如文件

这就是神奇之处:

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
});
*/

您不需要关心文件的内容类型,它会自动从文件扩展名检测到它,正如我建议使用的已接受答案中所述

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

cd /path/to/directory
http-server

我个人更喜欢使用nginx中的服务器文件,我还将其用于gzip编码、缓存、SSL处理和负载平衡,node只提供API。也许不是你想要的答案,但它提供了有趣的选择。也许你可以看看这个方法,发现你喜欢它

我做了以下更改以自动将文件包含在索引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>
<% } %>

你能进一步解释一下吗?这只会为文件夹中的每个文件提供服务吗?是的,它会为您传递它的目录中的每个文件提供服务。这很好,但是否有手动选择文件或隐藏子文件夹的选项?simpleS将无法为大约60kb的静态JSON文件提供服务。我在文档或搜索中找不到任何修复此问题的配置选项。使用http服务器工作得很好。@bayfrontconsulting,是的,我发现了这个错误,它与一个中断的流有关,该流正在提供最大64KB的数据块,并且停止了,我在版本0.4.9中修复了这个问题,该版本很快会有很多改进。希望您能再试一次:
cd /path/to/directory
http-server
//// 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>
<% } %>