簡體   English   中英

app.use(express.static("public")) 是否為每個請求調用中間件?

[英]Does app.use(express.static("public")) call the middleware for every request?

使用app.use(express.static("public"))是否為每個請求調用中間件,即使它不是對 static 資源的請求?

像那樣注冊時,中間件將在每個請求上運行,是的。 基本上是因為該語句實際上與以下內容相同:

app.use("/", express.static("public"))

調用express.static會返回一個經典的中間件 function,它將在您在app.use中指定的每個路徑上運行。 如果你想讓它只在特定路徑上啟動,你可以像這樣注冊它:

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

只有在路由尚未處理請求時才會調用它。

請記住,路由是按照它們注冊的順序進行測試的,舉個例子:

const express = require('express');
const app = express();
const port = 3000;

app.get('/foo', (req, res) => {
    console.log('Foo!');
    res.send('Foo!');
});

app.use(function (req, res, next) {
    console.log('middleware triggered');
    next();
});

app.get('/bar', (req, res) => {
    console.log('Bar!');
    res.send('Bar!');
});

app.listen(port, () => {
    console.log(`Example app listening at http://localhost:${port}`);
});

如果我請求http://localhost:3000/foo然后服務器將記錄:

Foo!

/foo端點匹配請求,然后調用res.send()

如果我請求http://localhost:3000/bar然后它記錄:

middleware triggered
Bar!

中間件啟動(因為它匹配路由),調用next()到 go 到下一個匹配路由的 function,然后調用/bar處理程序。


position 小心你的static中間件很重要。

如果你把它放在你想要匹配請求的路由之前,那么有兩種可能的負面影響:

  • 你會在不需要的時候調用它,這是低效的
  • static 文件將匹配路由而不是實際的路由處理程序

另一方面,如果你把它放在最后,那么你會解決效率問題,但一些糟糕的路由設計可能意味着某些東西會創建一個 URL 匹配一個已經存在的 static 文件並屏蔽它。

最好指定一個您知道永遠不會與路由沖突的目錄(例如app.use('/static', express.static('public')); )以避免這種可能性。 作為獎勵,這意味着任何通常為 404 的損壞鏈接都不必通過 static 中間件到 go,除非鏈接首先指向/static路徑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM