Каков самый простой способ использования статических файлов с помощью 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(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]);
});

Каков правильный способ сделать это?

Ответ 1

Для этого 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"));

Ответ 2

Если вы хотите иметь решение без использования 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 -статический глобально и использовать его как инструмент CLI, просто запустив его из оболочки внутри папки, которую вы хотите обслуживать:

$ static

Что это: -)!

PPS: Что касается вашего первоначального примера, было бы лучше использовать конвейер с потоками здесь вместо того, чтобы загружать все файлы синхронно.

Ответ 3

Как упоминалось в принятом ответе на этот вопрос, я бы рекомендовал использовать http-server.

Он может быть запущен через командную строку без какой-либо конфигурации

cd /path/to/directory
http-server

Ответ 4

Лично я предпочитаю файлы сервера из nginx (я также использую его для кодирования gzip, кеширования, обработки SSL и балансировки нагрузки), а node предоставляет только API. Возможно, это не тот ответ, который вы ищете, но он предлагает интересные варианты. Может быть, вы можете взглянуть на этот подход и найти, что вам это нравится;)

Ответ 5

Если вам нужен действительно простой способ, я хотел бы показать вам мой модуль (это не только для статических файлов) 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
});
*/

Вам не нужно заботиться о типе содержимого файлов, он автоматически обнаружит его из расширения файла

Ответ 6

Я сделал следующие изменения для 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>
<% } %>