问题描述
我现在正在学习表达,并且在理解表达中的中间件流程方面遇到困难。 例如,如果我有以下代码 从“ 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,next)=>{
console.log("app.use");
res.send("hello")
})
app.listen(1234,()=>{
console.log("started at port:1234");
});
这次,当我在浏览器中键入localhost:1234时,将在终端started at port:1234 app.use app.use app.use
和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,next)=>{console.log("app.use");res.send("hello")})
仅应执行一次?更不用说它内部有重新发送。
有人可以向我解释一下吗?谢谢您的帮助
解决方法
定义中间件的顺序很重要,当中间件堆栈中的第一个中间件与请求路径匹配时,它将负责处理请求。
我会举个例子
app.use('/',(req,res,next) => {
res.send('First middleware');
});
app.use('/',next) => {
res.send('Second middleware');
}
如您所见,两个中间件都具有相同的路径。当请求URL为http://localhost:[port_number]/
时,将执行中间件堆栈中的第一个请求处理程序,而第二个将不执行。
通常,当您导航到后端任何网站的根路径时,服务器将查找名为index.html
的文件,这是许多Web服务器的默认配置。因此,当您导航到express应用程序的根路径时,express会在其中提供所有静态文件的目录中包含一个名为index.html
的文件,其中express.static
中间件已附加到您的个性化中间件(如波纹管)之前。 / p>
app.use(express.static('public'));
app.use((req,next)=>{
console.log("app.use");
res.send("hello")
})
将显示index.html
目录内的public
文件,而不是hello
。