express - 使用 express.static('public') 时难以理解中间件的流程
问题描述
我现在正在学习express,我很难理解express中的中间件流程。例如,如果我有以下代码 import express from 'express';
const app = express();
app.use((req,res,next)=>{
console.log("app.use");
res.send("hello")
})
app.use(express.static('public'));
app.listen(1234,()=>{
console.log("started at port:1234");
});
当我在浏览器中键入 localhost:1234 时,我将在终端中获得以下内容started at port:1234, app.use
并在浏览器中获得“hello”。我理解这是因为第一个中间件有 res.send("hello") ,因此它发回 "hello" 而不将 res 传递给 app.use(express.static('public')) (公用文件夹有一个索引.html 在这种情况下未显示)
但是当我稍微修改代码时,我不再了解中间件的流程了
const app = express();
app.use(express.static('public'));
app.use((req,res,next)=>{
console.log("app.use");
res.send("hello")
})
app.listen(1234,()=>{
console.log("started at port:1234");
});
这次,started at port:1234 app.use app.use app.use
当我在浏览器中键入 localhost:1234 时,我将在终端和 index.html 中获得以下内容。首先,我不明白为什么我的浏览器中没有“你好”。我明白app.use(express.static('public'));
但是 app.use 是在其中app.use(express.static('public'));
有一个 res.send("hello") 之后出现的,因此发回的请求应该是 "hello" 而不是 index.html?其次,为什么终端显示“app.use”不止一次?app.use((req,res,next)=>{console.log("app.use");res.send("hello")})
应该只执行一次吗?更不用说它里面有一个 res.send 。谁能给我解释一下?谢谢你的帮助
解决方案
中间件定义的顺序很重要,当中间件堆栈中的第一个中间件与请求路径匹配时,它将负责处理请求。
我会举个例子
app.use('/', (req, res, next) => {
res.send('First middleware');
});
app.use('/', (req, res, next) => {
res.send('Second middleware');
}
如您所见,两个中间件具有相同的路径。中间件堆栈中的第一个请求处理程序将在请求 URL 时http://localhost:[port_number]/
执行,而第二个不会执行。
一般来说,当您在后端导航到任何网站的根路径时,服务器会查找名为 的文件index.html
,这是许多 Web 服务器的默认配置。index.html
因此,当您导航到 express 应用程序的根路径时,express 提供的所有静态文件所在的目录都包含一个名为的文件,该express.static
中间件附加在您的个性化中间件之前,如下所示。
app.use(express.static('public'));
app.use((req,res,next)=>{
console.log("app.use");
res.send("hello")
})
index.html
目录内的文件public
将被呈现,而不是hello
.
推荐阅读
- python - 嵌套字典到 pandas df 连接行
- sql-server - 返回余额低于阈值的所有记录
- talend - 在 talend 时间戳值未使用动态模式正确填充
- react-native - Reanimated 2创建worklet失败,可能是你忘记添加Reanimated的babel插件了?
- bash - Bash/Rust 问题:从 Bash 运行火焰图工作,从 Rust 失败
- wpf - 如何更新 wpf DataGrid 中的 DatePicker 值
- java - 在具有持久卷的 Kubernetes 中的 Docker 上运行时,Hadoop Java 失败
- php - Eloquent 模型关系不返回子关系特定的列值
- python - 装饰器有奇怪的行为
- dialogflow-es-fulfillment - 到 mongodb 的连接字符串