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 には、このためのミドルウェアが組み込まれています。これは、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"));
于 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 ツールとして使用することもできます。

$ static

それでおしまい :-)!

PPS:元の例に関しては、すべてのファイルを同期的にロードするのではなく、ここでストリームを使用してパイプを使用する方が良いでしょう。

于 2013-01-29T06:13:44.617 に答える
5

この質問に対する受け入れられた回答で述べたように、http-serverを使用することをお勧めします。

設定なしでコマンドラインから起動できます

cd /path/to/directory
http-server
于 2013-11-05T22:47:25.343 に答える
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 内のファイルを AUTO-INCLUDE するために以下の変更を行いました。そのため、フォルダーにファイルを追加すると、ファイルを 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 に答える