如果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
目录中似乎没有foo
或favicon.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(