Express.js:有趣的结果

时间:2014-07-10 05:49:01

标签: javascript node.js express

我目前正在从头开始学习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()路由的顺序?

1 个答案:

答案 0 :(得分:0)

在您定义路线时会对路线进行排序。 "*"路由捕获所有网址吗?因此,当express接收到url时,它会迭代所有路由,并且正在调用符合条件的第一个路由。这就是你没有调用第二条路线的原因。通常"*"路由留待最后。这也是ASP.NET MVC的路由工作方式。

编辑:"/"路由仅捕获http://url/网址,与其他网址不同。