【发布时间】:2017-02-15 05:49:30
【问题描述】:
我想展示一个自定义的 404 页面(包含 html、css、img 和 ico)。当我替换第一个公共静态主页时,我知道我的 404 文件夹有效。但是,我相信我要么没有以正确的方式使用路由,要么无法设置两个静态文件夹。
我根本不想使用模板视图引擎。我希望一切都在前端呈现。
我的项目如下:
404
--index.html
--error.css
--404.jpg
bin
--server.js
public
--index.html
routes
--index.js
package.json
app.js
app.js
...
var index = require(./routes/index); //works
...
app.use(favicon(__dirname + '/public/content/images/logo.ico'));
app.use(logger('dev'));
app.use(jsonParser);
app.use(urlencodedParser);
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public'))); //love it
app.use('/', index); //this is fine
...
index.js
var express = require('express');
const path = require('path');
var router = express.Router();
router.use(function timeLog(req, res, next) {
console.log('Time: ', Date.now());
next();
});
router.use('/', express.static(path.join(__dirname, './404'))); // HALP!
module.exports = router;
我玩过这个目录(尝试使用“404”与“./404”)。我正在通过输入“localhost:3000/error”对此进行测试。所以如果我的路径是'/error',它仍然应该使用父路径:'/'。文档指出,只要我的路线放在最后,它应该仍然有效。我在没有 express.static 的情况下对其进行了测试,并使用了一个在控制台上打印错误的匿名函数。
难道不能用两次 express.static() 吗?
【问题讨论】:
-
是的,您可以使用多个
express.static()。它只是中间件,您可以拥有任意数量的中间件。它们将按照您注册它们的顺序进行搜索。根本不清楚您要完成什么。如需静态路由帮助,请显示几个您希望在文件系统中加载特定文件的确切 URL 示例,并准确显示文件在文件系统中的位置。 -
不能使用任何路径吗?我想在主页之外的任何路径“/”上使用“express.static()”。换句话说,为什么 'router.use('/', express.static(path.join(__dirname, './404');' 不起作用?当我删除静态并仅测试 console.log 时它会起作用。
-
仅供参考,自定义 404 页面在任何情况下都不需要
express.static()。通常,您只需创建所需的 404 中间件处理程序作为最后一个中间件,然后res.sendFile()您要显示的任何文件。此处显示了 404 处理程序示例:expressjs.com/en/starter/faq.html。如果你只是想将一个完成的 HTML 文件发送到客户端(没有服务器端渲染),那么在 404 中间件中使用res.sendFile(someLocalFilePath)。 -
express.static()有多种使用方式。它可以配置为仅对某些请求路径起作用。或者,它可以配置为检查每个请求以查看是否有与其路径匹配的静态文件。根据定义,您不要将express.static()用于 404 处理程序。如果有一个文件与路由请求匹配并且express.static()找到它,那么它是 200 成功响应,而不是 404。您使用中间件来处理未找到其他路由的请求,并且在该中间件中,您将响应设置为静态 404并决定向浏览器发送什么。
标签: javascript node.js express static