我目前正在从头开始学习Express JS。我的目标是精通NodeExpress

在网上尝试一些示例时,我遇到了这种有趣的情况。我正在构建简单的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/网址,与另一个网址不同。

09-25 18:26
查看更多