node.js中路由,中間件,get請求和post請求的參數(shù)詳解
一、路由
1、什么是路由
服務(wù)器需要根據(jù)不同的URL或請求來執(zhí)行不一樣的操作,我們可以通過路由來實現(xiàn)這個步驟
2、實現(xiàn)路由的方法
2.1、get請求訪問網(wǎng)址時,做什么事
app.get("網(wǎng)址",function(req,res){
});
2.2、post請求訪問網(wǎng)址時,做什么事
app.post("網(wǎng)址",function(req,res){
});
2.3、任何請求訪問這個網(wǎng)址
app.all("網(wǎng)址",function(){
});
注意:1、’這里的網(wǎng)址不分大小寫,例如
app.get("/AAb",function(req,res){ //我們訪問 /aab也是可以的
res.send("你好");
});
2、你路由到/a , 實際/a?id=2&sex=nan 也能被處理?! ?/p>
3、路由中正則表達(dá)式的使用
3.1、正則表達(dá)式中,未知部分用圓括號分組,然后可以用req.params[0]、[1]得到。req.params類數(shù)組對象?!?/p>
app.get(/^\/student\/([\d]{10})$/,function(req,res){
res.send("學(xué)生信息,學(xué)號" + req.params[0]);
});
3.2、冒號寫法(推薦)
var express=require('express');
var app=express();
//冒號1
app.get("/student/:id",function (req,res) {
var id=req.params["id"]; //得到id的值
var reg=/^[\d]{6}$/;
if(reg.test(id)){
res.send(id);
}else {
res.send("請檢查格式");
}
});
//冒號2
app.get("/:username/:oid",function(req,res){
var username = req.params["username"]; //得到username的值
var oid = req.params["oid"]; //得到//oid的值
res.write(username);
res.end(oid);
});
app.listen(3000);
冒號1:

冒號2:

二、中間件
1、什么是中間件
應(yīng)用于應(yīng)用之間 充當(dāng)連接服務(wù)的,例如上面的get、post請求就是中間件
2、express中所有的路由(中間件)的順序(很重要)
2.1、next()方法
var express=require("express");
var app=express();
app.get("/",function (req,res,next) {
console.log(1);
next(); //如果沒有next參數(shù),就只會conlose出來1,而不會是1,2
});
app.get("/",function (req,res) {
console.log(2);
});
app.listen(3000);
2.2、順序沖突:下面這兩個路由,看起來沒有關(guān)系,但其實是有沖突的,因為admin可以當(dāng)做用戶名 login可以當(dāng)做id
var express=require("express");
var app=express();
app.get("/:username/:id",function(req,res){
console.log("1");
res.send("用戶信息" + req.params.username);
});
app.get("/admin/login",function(req,res){
console.log("2");
res.send("管理員登錄");
});
app.listen(3000)
2.3、解決順序沖突
2.3.1、具體的往上寫,抽象的往下寫
var express=require("express");
var app=express();
//具體的
app.get("/admin/login",function(req,res){
console.log("2");
res.send("管理員登錄");
});
//抽象的
app.get("/:username/:id",function(req,res){
console.log("1");
res.send("用戶信息" + req.params.username);
});
app.listen(3000)
2.3.2、檢索數(shù)據(jù)庫
var express=require("express");
var app=express();
app.get("/:username/:id",function (req,res,next) {
var username=req.params.username;
//檢索數(shù)據(jù)庫,如果username 不存在,那么next()
if(檢索數(shù)據(jù)庫){
console.log("1");
res.send("用戶信息")
}else{
next();
}
});
app.get("/admin/login",function (req,res) {
console.log("2");
res.send("管理員登錄");
});
app.listen(3000)
3.1、get.use()的模糊匹配
var express=require("express");
var app=express();
//匹配所有網(wǎng)址
//法一
//當(dāng)你不寫路徑的時候,實際上就相當(dāng)于“/”,就是所有網(wǎng)址
// app.use(function (req,res,next) {
// console.log(new Date());
// next(); //執(zhí)行下面的
// });
//法二
app.use("/",function (req,res,next) {
console.log(new Date());
next(); //執(zhí)行下面的
});
//匹配/admin所有地址,例如/admin/ss/aa這個都行
app.use("/admin",function (req,res) {
res.write(req.originalUrl+"\n"); // /admin/ss/aa
res.write(req.path+"\n"); // /ss/aa
res.write(req.baseUrl+"\n"); // /admin
res.end("你好");
});
app.listen(3000);
var express=require("express");
var fs=require("fs");
var app=express();
//當(dāng)你不寫路徑的時候,實際上就相當(dāng)于“/”,就是所有網(wǎng)址
app.use(haha); //haha是一個函數(shù)
app.listen(3000);
// function haha(req,res) {
// res.send("哈哈");
// }
app.use('/admin',function (req,res) {
res.send('管理員登錄');
})
//根據(jù)當(dāng)前的網(wǎng)址,讀取punlic文件夾的文件
//如果有這個文件,就渲染這個文件
//如果沒有這個文件,那么next()
function haha(req,res,next) {
var filePath=req.originalUrl;
//根據(jù)當(dāng)前的網(wǎng)址,讀取public文件夾的文件
//如果有這個文件,那么渲染這個文件
//如果沒喲偶這個文件,那么next();
fs.readFile("./public/"+filePath,function (err,data) {
if(err){
//文件不存在
next(); //一定要寫,不然處于掛起狀態(tài)
return;
}
res.send(data.toString());
})
}
4.1、res.send()方法快速測試頁
var express=require("express");
var app=express();
//靜態(tài)服務(wù)
app.use('/jingtai',express.static("./public"));
//新的路由
app.get('/images',function (req,res) {
res.send("哈哈")
});
//會自動識別err參數(shù),如果有,那么就這個函數(shù)能捕獲err
app.use(function (req,res) {
res.status(404).send("沒有這個頁面!");
})
app.listen(3000);
var express=require("express");
var app=express();
// //設(shè)置ejs文件夾名字 //在day3文件夾下新建文件夾a,然后在里面放ejs文件
// app.set("views","a")
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);
var express=require("express");
var app=express();
app.get("/",function (req,res) {
console.log(req.query);
res.send();
});
app.listen(3000);

三、get請求參數(shù)post請求參數(shù):
GET請求的參數(shù):在URL中,在Express中,不需要使用url模塊了??梢灾苯邮褂胷eq.query對象。
POST請求參數(shù):在express中不能直接獲得,必須使用body-parser模塊。使用后,將可以用req.body得到參數(shù)。但是如果表單中含有文件上傳,那么還是需要使用formidable模塊。
//form.ejs <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <form action="#" method="post"> <input type="text" name="name"/> <input type="text" name="age"/> <input type="submit"/> </form> </body> </html>
//.jsvar express=require("express");
var bodyParser=require('body-parser');
var app=express();
app.set('view engine','ejs')
app.get('/',function (req,res) {
res.render("form");
});
//bodyParser API
app.use(bodyParser.urlencoded({extended:false}));
app.post('/',function (req,res) {
console.log(req.body);
});
app.listen(3000);
運行結(jié)果:


相關(guān)文章
nodejs入門教程五:連接數(shù)據(jù)庫的方法分析
這篇文章主要介紹了nodejs入門教程之連接數(shù)據(jù)庫的方法,結(jié)合實例形式分析了nodejs連接數(shù)據(jù)庫的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-04-04
干凈卸載Windows的Node.js環(huán)境的方法
這篇文章主要介紹了如何干凈卸載Windows的Node.js環(huán)境的方法,文中通過圖文結(jié)合的方式講解的非常詳細(xì),對大家刪除Node.js環(huán)境有一定的幫助,需要的朋友可以參考下2025-01-01
node.js實現(xiàn)雙Token+Cookie存儲+無感刷新機制的示例
本文主要介紹了Node.js雙Token機制,以短期AccessToken和長期RefreshToken提升安全與體驗,結(jié)合Cookie存儲與自動刷新,實現(xiàn)無感登錄及多設(shè)備管理,感興趣的可以了解一下2025-05-05
Node.js中MongoDB更新數(shù)據(jù)的兩種方法
本文主要介紹了Node.js中MongoDB更新數(shù)據(jù)的兩種方法,主要包括使用原生的 MongoDB 驅(qū)動程序或者使用 Mongoose 來更新 MongoDB 數(shù)據(jù),2023-12-12
Node.js + Redis Sorted Set實現(xiàn)任務(wù)隊列
本文給大家分享的是使用Node.js + Redis Sorted Set實現(xiàn)任務(wù)隊列的方法示例,非常的實用,有需要的小伙伴可以參考下2016-09-09
Node.js中Sequelize?hook的使用方法小結(jié)
Sequelize?提供了多個?hook,用于在執(zhí)行數(shù)據(jù)庫操作時執(zhí)行一些自定義邏輯,本文為大家整理了一些常用的?Sequelize?hook?列表及其作用,希望對大家有所幫助2024-02-02

