app.use如何匹配以相同路径开始的请求



如果app.use()响应任何以/开头的路径,那么为什么请求localhost:3000/foo将匹配第二个方法而不是第一个方法?

app.use("/",express.static('public'),
function(req,res,next) { console.log("1"); next(); })
app.use("/", function(req, res) {
res.send("2")
var fullUrl = req.protocol + '://' + req.get('host') + req.originalUrl;
console.log(fullUrl);
})

请求:localhost:3000/foo

控制台中的输出(web浏览器中仅打印静态文件夹中的2而非index.html(:

1
http://localhost:3000/foo
1
http://localhost:3000/favicon.ico

按顺序调用路由处理程序和中间件,直到其中一个没有链接到下一个。

在您的示例中,您设置了三个处理程序/中间件:

  • express.static
  • 记录"1"的函数
  • 发送"2"并记录路径的函数

默认情况下,Express的静态服务会查找匹配的文件并发送它。如果找不到匹配的文件,它会通过next链接到下一个处理程序/中间件。因此,在public目录中似乎没有foofavicon.ico文件,因为静态处理程序链接到记录"1"的处理程序。

记录"1"的处理程序总是通过next()链接到下一个。如果它没有,也没有发送任何东西,请求就会一直挂在那里,无法解决。

返回"2"并记录路径的处理程序没有链接,而是使用res.send()来结束响应。

更多:

  • https://expressjs.com/en/guide/routing.html
  • https://expressjs.com/en/guide/using-middleware.html
  • https://expressjs.com/en/starter/static-files.html链接到https://expressjs.com/en/resources/middleware/serve-static.html这意味着如果它没有找到匹配,它将连锁(而不是返回404(

最新更新