Простейший способ заставить Express обслуживать страницу по умолчанию?

Я использую это, чтобы иметь Node.js/Express setup как рудиментарный веб-сервер - он просто обслуживает набор статических страниц без какой-либо другой обработки. Я бы хотел, чтобы он всегда служил /default.html, когда браузер извлекает сайт без имени файла.

var express = require("express");
var app = express();
var port = process.env.PORT || 5000;

app.configure(function(){
  app.use(express.bodyParser());
});

app.use(express.logger());

app.use(express.static(__dirname ));

app.listen(port, function() {
  console.log("Listening on " + port);
});

Я пробовал использовать res.sendfile и res.redirect, но без особого успеха; Я, очевидно, что-то пропустил, так как в итоге я получил ошибку "не имеет метода".

Что бы вы сказали, это самый простой способ достижения моей цели?

Ответ 1

Вы могли бы сделать что-то вроде этого. Предположим, что это html файл, относящийся к файлу .js:

app.get('/', function(req, res){
    res.sendfile('default.html', { root: __dirname + "/relative_path_of_file" } );
});

Ответ 2

Я кратко рассмотрел рекомендации по обслуживанию общей папки и указания страницы по умолчанию для обслуживания. После рассмотрения документации "Express middleware" мое решение выглядит следующим образом:

var express = require('express');
var app = express();

var options = {
  index: "coming-soon.html"
};

app.use('/', express.static('app', options));

var server = app.listen(8081, function () {
  var host = server.address().address;
  var port = server.address().port;

  console.log('my app is listening at http://%s:%s', host, port);
});

Ответ 3

Я добавил свои собственные варианты с дополнительным "мясом" на нем, чтобы продемонстрировать, как вы можете включить маршрутизацию. Я поместил весь следующий код в файл под названием "routes.js":

var express = require('express'),
    painting = require('./controllers').Painting,
    gallery = require('./controllers').Gallery;

module.exports.initialize = function(appSvr, router) {
    router.get('/paintings', painting.list);
    router.get('/galleries', gallery.list);

    appSvr.use('/', router);
    appSvr.use('/', express.static(__dirname + '/../public', { index: 'index.html' }));
};

Затем я вызываю этот файл в файле "configure.js", который потребуется в файле "server.js":

var routes = require('./routes'),
    express = require('express'),
    bodyParser = require('body-parser');

module.exports = function(appSvr) {
    appSvr.use(bodyParser.urlencoded());
    appSvr.use(bodyParser.json());
    routes.initialize(appSvr, new express.Router());

    return appSvr;
};

Я не видел, как лучше обрабатывать маршрутизацию, но этот код работает для меня.

Вам понравилась бы некоторая обратная связь!

Ответ 4

Странно, что никто не упомянул перенаправление.

app.get('/', function(req, res){
    res.redirect('/default.html');
});

В этом -of course- предполагается, что у вас есть "default.html" в публичном пути. Вы можете установить свой публичный путь с помощью:

app.use(express.static(relative_path_to_project_root));