1. 程式人生 > >node09---中間件

node09---中間件

檢索 文件夾 ams 自動 用戶訪問 127.0.0.1 sss 網址 我們

如果我的的get、post回調函數中,沒有next參數,那麽就匹配上第一個路由,就不會往下匹配了。
如果想往下匹配的話,那麽需要寫next()
1app.get("/",function(req,res,next){
2    console.log("1");
3    next();
4});
5
6app.get("/",function(req,res){
7    console.log("2");
8});

下面兩個路由,感覺沒有關系:
1app.get("/:username/:id",function(req,res){
2    console.log("1");
3    res.send("用戶信息" + req.params.username);
4}); 5 6app.get("/admin/login",function(req,res){ 7 console.log("2"); 8 res.send("管理員登錄"); 9}); 但是實際上沖突了,因為admin可以當做用戶名 login可以當做id。 解決方法1:交換位置。 也就是說,express中所有的路由(中間件)的順序至關重要。 匹配上第一個,就不會往下匹配了。 具體的往上寫,抽象的往下寫。 1app.get("/admin/login",function(req,res){ 2 console.log("2"); 3 res.send("管理員登錄");
4}); 5 6app.get("/:username/:id",function(req,res){ 7 console.log("1"); 8 res.send("用戶信息" + req.params.username); 9}); 報錯,因為send了兩次。 解決方法2: 1app.get("/:username/:id",function(req,res,next){ 2 var username = req.params.username; 3 //檢索數據庫,如果username不存在,那麽next() 4 if(檢索數據庫){ 5 console.log("1");
6 res.send("用戶信息"); 7 }else{ 8 next(); 9 } 10}); 11 12app.get("/admin/login",function(req,res){ 13 console.log("2"); 14 res.send("管理員登錄"); 15}); 路由get、post這些東西,就是中間件,中間件講究順序,匹配上第一個之後,就不會往後匹配了。next函數才能夠繼續往後匹配。 -------------------------------------------------------------------------------- app.use()也是一個中間件。與get、post不同的是,他的網址不是精確匹配的。而是能夠有小文件夾拓展的。 比如網址: http://127.0.0.1:3000/admin/aa/bb/cc/dd 1app.use("/admin",function(req,res){ 2 res.write(req.originalUrl + "\n"); // /admin/aa/bb/cc/dd 3 res.write(req.baseUrl + "\n"); // /admin 4 res.write(req.path + "\n"); // /aa/bb/cc/dd 5 res.end("你好"); 6}); 如果寫一個/ 1//當你不寫路徑的時候,實際上就相當於"/",就是所有網址 2app.use(function(req,res,next){ 3 console.log(new Date()); 4 next(); 5}); app.use()就給了我們增加一些特定功能的便利場所。 實際上app.use()的東西,基本上都從第三方能得到。 ● 大多數情況下,渲染內容用res.render(),將會根據views中的模板文件進行渲染。如果不想使用views文件夾,想自己設置文件夾名字,那麽app.set("views","aaaa"); ● 如果想寫一個快速測試頁,當然可以使用res.send()。這個函數將根據內容,自動幫我們設置了Content-Type頭部和200狀態碼。send()只能用一次,和end一樣。和end不一樣在哪裏?能夠自動設置MIME類型。 ● 如果想使用不同的狀態碼,可以: res.status(404).send(‘Sorry, we cannot find that!‘); ● 如果想使用不同的Content-Type,可以: res.set(‘Content-Type‘, ‘text/html‘);

06.js

/**
 * Created by Danny on 2015/9/22 10:47.
 */
var http = require("http");

// 這個語句,就在打開服務器的時候,執行一次。
// 每次用戶訪問的時候,不執行這個語句
var a = 100;

var server = http.createServer(function(req,res){
    // 用戶訪問的時候,執行這裏的語句:
    a++;
    res.end(a.toString());
});

server.listen(3000,"127.0.0.1");

07.js

/**
 * Created by Danny on 2015/9/22 10:22.
 */
var express = require("express");

var app = express();

var a = 100;

//路由從上往下找,找到就不向下找了,
app.get("/:username/:id",function(req,res,next){
    var username = req.params.username;
    //檢索數據庫,如果username不存在,那麽next()
    if(檢索數據庫){
        console.log("1");
        res.send("用戶信息");
    }else{
        next();//繼續向下找匹配的路由
    }
});

app.get("/admin/login",function(req,res){
    console.log("2");
    res.send("管理員登錄");
});


app.listen(3000);

08.js

/**
 * Created by Danny on 2015/9/22 10:22.
 */
var express = require("express");

var app = express();

//當你不寫路徑的時候,實際上就相當於"/",就是所有網址
app.use(function(req,res,next){
    console.log(new Date());
    next();
});

//http://localhost:3000/haha/ssss是匹配不了的
app.get("/haha",function(req,res){
    console.log("哈哈");
});
//http://127.0.0.1:3000/admin/aa/bb/cc/dd
app.use("/admin",function(req,res){
    res.write(req.originalUrl + "\n");//    /admin/aa/bb/cc/dd
    res.write(req.baseUrl + "\n");//   /admin
    res.write(req.path + "\n");
    res.end("你好");
});

app.listen(3000);

09.js

/**
 * Created by Danny on 2015/9/22 10:22.
 */
var express = require("express");
var fs = require("fs");

var app = express();

//當你不寫路徑的時候,實際上就相當於"/",就是所有網址
app.use(haha);

app.get("/admin",function(req,res){
    res.send("管理員");
})

app.listen(3000);

function haha(req,res,next){
    var filePath = req.originalUrl;
    //根據當前的網址,讀取public文件夾中的文件
    //如果有這個文件,那麽渲染這個文件
    //如果沒有這個文件,那麽next();
    fs.readFile("./public/" + filePath,function(err,data){
        if(err){
            //文件不存在
            next();
            return;
        }
        res.send(data.toString());
    });
}

10.js

/**
 * Created by Danny on 2015/9/22 10:22.
 */
var express = require("express");

var app = express();

//靜態服務,一般靜態資源往上寫。不執行next();
app.use("/jingtai",express.static("./public"));

//新的路由
app.get("/images",function(req,res){
    res.send("哈哈");
});

//會自動識別err參數,如果有,那麽就這個函數能捕獲err
app.use(function(req,res){
    res.status(404).send("沒有這個頁面!");
});

app.listen(3000);

11.js

/**
 * Created by Danny on 2015/9/22 10:22.
 */
var express = require("express");
var app = express();
app.set("views","aaaa");//如果不想使用views文件夾,想自己設置文件夾名字,
app.set("view engine","ejs");

app.get("/",function(req,res){
    res.render("haha",{news:[]});
});

app.get("/check",function(req,res){
    res.send({
        "user" : "ok"
    });
});

app.listen(3000);

node09---中間件