我目前正在从头开始学习Express JS
。我的目标是熟练使用Node
和Express
。
在线尝试一些例子时,我遇到了这个有趣的场景。我正在构建简单的http server
。代码如下。
var express = require("express");
var port = 8080;
var app = express();
app.get("*",function(req,res){
res.end("Hello World!");
});
app.listen(port,function(){
console.log("Listening on Port: %s",port);
});
如果我通过点击http://localhost:8080
来运行此操作,则会输出Hello World!
。完美,伟大。
然后我尝试使用此代码
通过URL
传递一些参数
var express = require("express");
var port = 8080;
var app = express();
app.get("/name/:user_name",function(req,res){
res.status(200);
res.set('Content-type','text/html');
res.end("<html><body><h1>Hello "+req.params.user_name+"!!!</h1></body></html>");
});
app.get("*",function(req,res){
res.end("Hello World!");
});
app.listen(port,function(){
console.log("Listening on Port: %s",port);
});
然后我点击http://localhost/name/Maverick
来运行它,它输出Hello Maverick!!!
。很棒,很完美。
但这是有趣的部分,当我切换app.get("*")
和app.get("/name/:user_name")
的顺序时,输出会发生变化。
例如,如果我将app.js
代码更改为
var express = require("express");
var port = 8080;
var app = express();
app.get("*",function(req,res){ // <<<<--------- app.get("*") is first in this case
res.end("Hello World!");
});
app.get("/name/:user_name",function(req,res){
res.status(200);
res.set('Content-type','text/html');
res.end("<html><body><h1>Hello "+req.params.user_name+"!!!</h1></body></html>");
});
app.listen(port,function(){
console.log("Listening on Port: %s",port);
});
如果我按下http://localhost:8080/name/Maverick
运行它,则会输出Hello World
。
问题是,app.get()
路线的顺序是否重要?
即使我为/name/:user_name
定义了路由,为什么不调用它?
有没有办法让代码独立于定义app.get()
路由的顺序?
答案 0 :(得分:0)
在您定义路线时会对路线进行排序。 "*"
路由捕获所有网址吗?因此,当express接收到url时,它会迭代所有路由,并且正在调用符合条件的第一个路由。这就是你没有调用第二条路线的原因。通常"*"
路由留待最后。这也是ASP.NET MVC的路由工作方式。
编辑:"/"
路由仅捕获http://url/
网址,与其他网址不同。