【问题标题】:simplest way to have Express serve a default page?让 Express 提供默认页面的最简单方法?
【发布时间】:2019-04-28 18:55:29
【问题描述】:

我使用它来将 Node.js/Express 设置为基本的 Web 服务器 - 它只提供一组静态页面,无需任何其他处理。当浏览器获取没有任何文件名的站点时,我希望它始终提供 /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,但没有成功;我显然遗漏了一些东西,因为我最终遇到了“没有方法”错误。

您认为实现我的目标最简单的方法是什么?

【问题讨论】:

  • 您是在服务器根 ('/') 上发出请求时尝试发送 default.html,还是每次找不到要提供的静态文件时发送?
  • 前者,虽然后者也可以。

标签: node.js express


【解决方案1】:

我简要地寻找了提供公用文件夹和指定要提供的默认页面的最佳实践。查看“Express 中间件”文档后,我的解决方案如下所示,

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);
});

【讨论】:

  • tl;dr app.use('/', express.static('app', {index: "coming-soon.html"}));
【解决方案2】:

你可以做这样的事情。假设它是一个相对于 .js 文件的 html 文件:

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

【讨论】:

  • 非常好,谢谢。我把它(当然是在编辑 /relative_path_of_file 之后)放在 app.listen 之前,它正是我想要的。我仍然不确定为什么我的其他尝试都失败了,但这是一个很好的解决方案。
【解决方案3】:

奇怪的是没有人提到重定向。

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

这-当然-假设您在公共路径中有“default.html”。 您可以使用以下方法设置公共路径:

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

【讨论】:

    【解决方案4】:

    我添加了我自己的变体,上面有一些额外的“肉”,以展示您甚至可以如何包含路由。我将以下所有代码放在一个名为“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' }));
    };
    

    然后我在“server.js”文件中需要的“configure.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;
    };
    

    我还没有看到如何最好地处理路由,但这段代码似乎对我有用。

    希望得到一些反馈!

    【讨论】:

    • { index: 'index.html' } 拯救了我的一天
    猜你喜欢
    • 2015-03-19
    • 2013-01-12
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多