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