使用 express.js 在 node.js 中提供 html 的最佳实践是啥?

Posted

技术标签:

【中文标题】使用 express.js 在 node.js 中提供 html 的最佳实践是啥?【英文标题】:What is the best practice for serving html in node.js with express.js?使用 express.js 在 node.js 中提供 html 的最佳实践是什么? 【发布时间】:2013-05-11 17:10:06 【问题描述】:

我目前正在我的 app.js/server.js 文件中提供我所有的 html,如下所示:

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

【问题讨论】:

这更像是一个 express.js 问题而不是 node.js,添加标签和改写问题。 【参考方案1】:

您可以使用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

文档:

http://expressjs.com/api.html#app.use http://www.senchalabs.org/connect/static.html http://expressjs.com/faq.html#multiple-statics

【讨论】:

这会在所有其余页面上调用 get 还是我仍然必须使用 app.use("/about" ...) 等等?如果不是,那么它如何从这一行中知道获取其余页面? 如果你例如写app.use("/", express.static(__dirname + '/public'));public文件夹中的所有文件将是服务器。 另外,在上面添加了更多我已经拥有的可能相似的文件(因为我正在使用静态调用。 我试过了,但它只获取索引,其他所有内容都出现 404 错误,页面未加载。 尝试隔离为文件提供服务的部分,也许为此编写一个小型服务器,以便掌握它。【参考方案2】:

一个想法是使用一条包罗万象的路线作为最后一条路线,如下所示:

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

【讨论】:

以上是关于使用 express.js 在 node.js 中提供 html 的最佳实践是啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Express.js 在 Node.js 中设置路由的最佳方式

node.js + express.js:使用 mongodb/mongoose 处理会话

我可以在 Node.js/Express 中动态导入 TypeScript 模块吗?

javascript 在Express.JS中的Node.JS中使用Fetch API

在Javascript(node.js,express.js,ejs)中访问服务器端变量[关闭]

如何在 Node.js / Express.js 中将中间件放在它自己的文件中