Как лучше всего обслуживать html в node.js с помощью express.js?

В настоящее время я отправляю весь свой html прямо в файл app.js/server.js следующим образом:

app.get('/', function(req, res) {
    res.render('index.html');
});
app.get('/about', function(req, res) {
    res.render('about.html');
});
app.get('/projects', function(req, res) {
    res.render('projects.html');
});

Я предполагаю, что если у меня есть 15+ html-страниц, это, вероятно, не лучший способ их назвать. Есть ли лучший способ обслуживать их из другого файла или места и использовать экспорт или что-то еще, чтобы иметь возможность вызывать только одну функцию или что-то в app.js. Возможно, для этого и предназначена маршрутизация, но, возможно, я не слишком хорошо ее понимаю.

(добавлено больше кода, который находится в том же файле)

app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/public');

// used below code to render html files
app.engine('html', require('ejs').renderFile);

app.set('view engine', 'ejs');
app.use(express.favicon("public/img/favicon.ico"));
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));

person Community    schedule 16.05.2013    source источник
comment
это скорее вопрос express.js, чем node.js, добавление тега и вопрос перефразирования.   -  person Vicary    schedule 16.05.2013


Ответы (2)


Вы можете использовать промежуточное ПО static:

app.use("/", express.static(__dirname));

Пример сервера:

var express = require('express');
var app = express();
app.use('/', express.static(__dirname + '/public'));
app.listen(3000, function() { console.log('listening')});

Это файловая структура:

.
├── public
│   ├── a.html
│   ├── b.html
│   └── c.html
└── server.js

Документация:

person Alberto Zaccagni    schedule 16.05.2013
comment
Это вызовет получение на всех остальных страницах или мне все еще нужно использовать app.use(/about ...) и так далее? Если нет, то как он узнает, что только из этой одной строки можно получить остальные страницы? - person ; 16.05.2013
comment
Если вы, например, напишите app.use("/", express.static(__dirname + '/public'));, все файлы в папке public будут серверными. - person Alberto Zaccagni; 16.05.2013
comment
Кроме того, выше добавлено больше файлов для того, что у меня уже есть, что может быть похоже (поскольку я использую статический вызов. - person ; 16.05.2013
comment
Я пробовал это, но он получает только индекс, а все остальное имеет ошибку 404, и страница не загружается. - person ; 16.05.2013
comment
Попробуйте изолировать часть, которая обслуживает файлы, возможно, напишите для этого небольшой сервер, чтобы вы поняли, как это работает. - person Alberto Zaccagni; 16.05.2013
comment
Я в замешательстве, как это сделать? Я пробую разные способы включения того, что вы сказали, но у меня возникают проблемы с тем, чтобы любая страница работала рядом с индексом, даже если я вызываю каталог. Как вы думаете, какой-либо другой код, который я добавил выше, который находится в моем файле app.js, противодействует статическому вызову? - person ; 16.05.2013
comment
Я включил пример, он правильно обслуживает каждый html-файл для меня, попробуйте следовать ему. - person Alberto Zaccagni; 16.05.2013
comment
Я вижу, что это работает, но теперь проблема заключается в том, что мне нужно иметь about.html в расширении для загрузки страницы, в отличие, например, от /about. - person ; 17.05.2013
comment
Я помню, что у подключения есть возможность перезаписи URL-адресов, вы можете попробовать посмотреть на это. - person Alberto Zaccagni; 17.05.2013
comment
хорошо, спасибо, я посмотрю на это, и последнее, как я изначально написал, менее эффективно, кстати? - person ; 17.05.2013
comment
Я не знаю, я думаю, что нет... но вы могли бы написать тест для этого, один сервер с моим примером и один с вашим :D - person Alberto Zaccagni; 17.05.2013
comment
ха-ха, кк, потому что я читал о том, что статические страницы постоянно приходится извлекать из кеша, как я написал, или что-то в этом роде... - person ; 17.05.2013

Одна из идей состоит в том, чтобы использовать универсальный маршрут в качестве последнего маршрута, например:

app.get('/:page', function(req, res) {
  res.sendfile(path.join(__dirname, 'public', 'pages', path.basename(req.params.page) + '.html'));
});

Это потребует, чтобы вы поместили свои файлы .html в public/pages/about.html и т. д.

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

приложение

app.set('view engine', 'ejs');
app.use(express.favicon("public/img/favicon.ico"));
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.static(path.join(__dirname, 'public')));
app.use(app.router);
person Jacob Gillespie    schedule 16.05.2013