在使用express.static(';public';)时难以理解中间件的流程

在使用express.static(';public';)时难以理解中间件的流程,express,middleware,Express,Middleware,我现在正在学习express,很难理解express中中间件的流程。 例如,如果我有以下代码 从“快递”进口快递 const app = express(); app.use((req,res,next)=>{ console.log("app.use"); res.send("hello") }) app.use(express.static('public')); app.listen(1234,()=>{

我现在正在学习express,很难理解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");
});
我将在终端
中获得以下信息,从端口1234开始,应用程序。在浏览器中键入localhost:1234时,在浏览器中使用
和“hello”。我理解这一点,因为第一个中间件具有res.send(“hello”),因此它将返回“hello”,而不将res传递给app.use(express.static(“public”))(公用文件夹具有index.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");
});
这一次,当我在浏览器中键入localhost:1234时,我将在从端口1234 app.use app.use app.use
开始的终端
中获得以下内容和index.html。
首先,我不明白为什么我的浏览器里没有“你好”。我理解
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:[端口号]/
,第二个将不执行

通常,当您导航到后端任何网站的根路径时,服务器将查找名为
index.html
的文件,这是许多web服务器的默认配置。因此,当您导航到express应用程序的根路径时,express服务的所有静态文件所在的目录包含一个名为
index.html
的文件,该应用程序在个性化中间件(如bellow)之前附加了
express.static
中间件

app.use(express.static('public'));

app.use((req,res,next)=>{
    console.log("app.use");
    res.send("hello")
})
将呈现
public
目录中的
index.html
文件,而不是
hello