我目前正在从头开始学习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()
路由的定义顺序? 最佳答案
定义路线时会对其进行排序。 "*"
路由捕获所有URL,对吗?因此,当express收到一个url时,它会迭代所有路由,并且会调用第一个符合条件的路由。这就是为什么您的第二条路线没有被调用的原因。通常,"*"
路由留在最后。这也是ASP.NET MVC路由的工作方式。
编辑:"/"
路由仅捕获http://url/
网址,与另一个网址不同。