[英]Why http-auth does not work with express.static middleware?
[英]How does fallthrough work with express.static()?
所以,我有一个基本的快速设置,如下所示:
const path = require("path");
const express = require("express");
const app = express();
app.use(express.static(path.join(__dirname, "public")));
app.get("/", (req, res) => {
res.send("Home Page");
});
app.get("/about", (req, res) => {
res.send("About Page");
});
app.listen(3000, () => {
console.log("Server listening on PORT 3000");
});
在上面的代码中, app.use()
中间件将为每个请求执行,因为app.use()
的默认路径是/
。
现在express.static()
将服务于public
目录,所以如果我 go 到/
路由,我将看到index.html
文件的内容,并且app.get("/")
中间件不会被执行。
但是当我 go 到/about
时,我看到了从app.get("/about")
发送的内容。 这是我不明白的,因为根据文档,它仅在找不到文件时才调用next()
,但是当找到文件时,请求就会停止。
因此,当我导航到/about
时, app.use()
将是第一个被执行的,它会找到index.html
文件并应该呈现它,但它会调用next
并执行 about 的get
处理程序。 为什么?
我不太清楚 static 资产是如何提供服务的,我想当我将 go 转到/about
时,它实际上并不是在寻找index.html
文件,但它在寻找什么文件?
从express.static()
文档https://expressjs.com/en/4x/api.html#express.static :
function 通过将 req.url 与提供的根目录组合来确定要服务的文件。
(可选)它还将查找目录索引文件 - 请参阅index
选项。
所以在你的场景中:
/
将匹配根目录中的index.html
文件。/about
将尝试匹配名为about
的文件,或./about
子目录中的index.html
文件。 如果没有这样的匹配,那么请求将被传递到下一个 middelware。root 参数指定提供 static 资产的根目录。 function 通过将 req.url 与提供的根目录组合来确定要服务的文件。
因此, app.use(express.static(path.join(__dirname, "public")))
服务于public
目录。
/
路线请记住,要服务的文件将通过将req.url
与 root 组合来确定。 因此,在这种情况下req.url
是/
并且 root 是public
。 因此 express 将尝试提供public/index.html
,其中index.html
是默认值,如果没有明确指定文件。
发送指定的目录索引文件。 设置为 false 以禁用目录索引。
这个文件将被找到并被渲染并且请求在那里结束,因此/
的 get 处理程序不会被执行。
您可以将index
属性设置为false
,然后 express 默认不会查找index.html
文件。
因此,设置app.use(express.static(path.join(__dirname, "public"), { index: false }))
将使 express 默认不查找index.html
文件,现在如果您访问/
路由, /
的get
处理程序将被执行。
/about
路线这次req.url
是/about
,所以 express 将尝试提供public/about/index.html
,它不会被找到,因此它调用next()
并且/about
的 get 处理程序被执行。
/about.html
路线这次req.url
是/about.html
,所以 express 将尝试提供public/about.html
,如果找到将被称为next()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.