【发布时间】:2018-11-10 14:19:57
【问题描述】:
我创建了一个网页以在本地使用它。我有很多如下所示的路线——31 个.ejs 文件和3 个.html 文件。 (它们都在同一个“views”文件夹中)。
//app.js - using node and express
app.get('/page1', function(req, res){
res.render('page1');
});
app.get('/page2', function(req, res){
res.sendFile('views/page2.html', { root: __dirname });
});
我对这些文件中的每一个都使用app.get。我有一种感觉,它不是 DRY 代码,所以现在我正试图找出一种更优雅、更优化的方法来实现相同的结果。
我知道许多
res.sendFile();可以替换为单个express.static()中间件语句。我通常在一个“公共”文件夹上使用express.static(),我用它来保存我所有的css文件——比如app.use(express.static(path.join(__dirname, 'public')));。但我仍然不明白如何使用它来简化我所有的res.sendFile()。至于许多
res.render();路由,我知道如果我不传递任何自定义数据,我可能会用一个处理整个模板文件目录(及其相应路由)的中间件来替换它们) 或文件列表。我只是不知道该怎么做。
非常感谢任何帮助,谢谢!
[更新]
- 里奇
- node_modules
- public
- css 文件、图片等
- 观看次数
- 部分
- 所有部分文件
- programmingPublic
- 来自同一主题的所有 ejs 文件
- 其他文件(html 和其他 ejs)
- appjs
- packagejson
- package-lockjson
const express = require('express');
const bodyParser = require('body-parser');
const path = require('path');
const app = express();
// Body Parser Middleware
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
// engine
app.set("view engine", "ejs");
// Set static path
app.use(express.static(path.join(__dirname, 'public')));
const fs = require('fs');
function renderStatic(dir) {
return function(req, res, next) {
let target = path.join(dir, req.path);
fs.access(target, fs.constants.R_OK, function(err) {
if (err) {
// file not found, just move on
next();
} else {
res.render(target);
}
});
}
}
app.use(renderStatic(path.join(__dirname, "views/programmingPublic")));
以下是我的侧边菜单的格式:(所有这些文件都在“programmingPublic”文件夹中)
<a href="/programming" class="title">Programming</a>
<li><a href="/c">C</a></li>
<li><a href="/cpp">C++</a></li>
<li><a href="/python">Python</a></li>
<li><a href="/javascript">JavaScript</a></li>
<li><a href="/php">PHP</a></li>
【问题讨论】:
-
在这个目录层次结构中,
__dirname在哪里?而且,当您的侧菜单中有/javascript之类的链接时,您希望显示什么文件?而且,它在哪里? -
我认为
__dirname是“richie”文件夹,因为它是所有文件和文件夹的根目录。/javascript是页面的名称——我在上面保存了有关语言的信息。 -
所有这些文件(programming、c、cpp、python、javascript、php)都在programmingPublic文件夹中
-
您是否尝试渲染没有文件扩展名的文件?
-
它们都是
.ejs文件。我在 app.js 文件上使用了app.set("view engine", "ejs");(就像我上面展示的那样),它总是有效的。
标签: javascript node.js express