一海铆、簡(jiǎn)介
Express 是一個(gè)簡(jiǎn)潔而靈活的 node.js Web應(yīng)用框架, 提供了一系列強(qiáng)大特性幫助你創(chuàng)建各種 Web 應(yīng)用,和豐富的 HTTP 工具踪少。使用 Express 可以快速地搭建一個(gè)完整功能的網(wǎng)站塘安。
二、安裝與運(yùn)行
終端輸入命令安裝援奢,這與其他模塊一樣
sudo npm install express
運(yùn)行并初始化express
var express = require("express");
var app = express();//初始化
三兼犯、核心功能
路由
引入一下模塊,body-parser是post請(qǐng)求方式封裝的模塊,get請(qǐng)求不可用免都。
var express = require("express");
var app = express();
var querystring = require("querystring");
// 只是post請(qǐng)求方式取參
var bodyParser = require("body-parser");
var app = express();
// 引入bodyParser
app.use(bodyParser.urlencoded({
extended:true
}));
獲取請(qǐng)求參數(shù)* req.host:返回請(qǐng)求頭里取的主機(jī)名(不含端口號(hào))* req.path:返回請(qǐng)求的url的路徑名* req.query:是一個(gè)可獲取客戶端get請(qǐng)求路徑參數(shù)的對(duì)象屬性,包含著被解析過的請(qǐng)求參數(shù)對(duì)象,默認(rèn)為{}* req.params:獲取路由的parameters
返回參數(shù)
- res.send();返回?cái)?shù)據(jù),默認(rèn)會(huì)轉(zhuǎn)為字符串,編碼為utf8* res.sendFile();返回文件* res.sendStatus();返回狀態(tài)碼
- get請(qǐng)求
app.get(path,cb)锉罐;
- path:為請(qǐng)求的路徑
- cb :第二個(gè)參數(shù)為處理函數(shù)的回調(diào),有兩個(gè)參數(shù)request和response,代表請(qǐng)求信息和響應(yīng)信息
- 使用res.sendFile()方法加載post提交頁面
- 使用res.send()方法傳輸數(shù)據(jù),
使用express模板比原生的node傳輸方便了很多绕娘,不需要去獲取pathname,判斷pathname的值...,只需要用app.get()就能實(shí)現(xiàn)數(shù)據(jù)交互的功能了脓规。
app.get("/",function (req,res) {
// res.send("<h1>我是主頁</h1>");
// 加載post提交頁面
res.sendFile(__dirname+"/post.html");
})
app.get("/goods",function (req,res) {
res.send("我是商品頁");
})
- post請(qǐng)求
使用app.post()來處理post請(qǐng)求;
原生node獲取數(shù)據(jù)的方法险领,用流的方式讀取數(shù)據(jù)侨舆,讀完后獲得數(shù)據(jù),而使用body-parser模板時(shí)绢陌,post傳輸?shù)臄?shù)據(jù)便在req.body中挨下,直接取就可以了,簡(jiǎn)化了讀文檔流的步驟脐湾。body-parser的配置看上面的已經(jīng)配置了臭笆。
app.post("/post",function (req,res) {
// 原生node獲取post參數(shù)的寫法
// var str = "";
// req.on("data",function (chunk) {
// str += chunk;
// })
// req.on("end",function () {
// var data = querystring.parse(str);
// console.log(data);
// res.send(`<h1>姓名是:${data.username}年齡是:${data.age}</h1>`);
// })
// 通過body-parser獲取到參數(shù)
console.log(req.body);
res.send(`<h1>姓名是:${req.body.username}年齡是:${req.body.age}</h1>`);
});
- post或者get請(qǐng)求
express模板封裝了一個(gè)all方法,來處理不管是任何方式發(fā)送的請(qǐng)求秤掌,*為任意路徑愁铺。
// get請(qǐng)求或者是post請(qǐng)求;
app.all("/*",function (req,res) {
// console.log(req._parsedUrl.pathname);
var pathname = req._parsedUrl.pathname;
if(pathname=="/get"){
var data = req.query;
res.send(JSON.stringify(data));
}else if(pathname!="/favicon.ico"){
res.sendFile(__dirname+pathname);
}
});
中間件
中間件的概念如下:
中間件能將數(shù)據(jù)進(jìn)行傳遞闻鉴,使用app.use方法實(shí)現(xiàn)茵乱,參數(shù)next指下一個(gè)中間件。如下面代碼孟岛,money一層一層往下傳瓶竭,每個(gè)中間件都能對(duì)此進(jìn)行操作。
var express = require("express");
var app = express();
// 中間件
app.use(function (req,res,next) {
// 省政府
req.money = 100;
next();
});
app.use(function (req,res,next) {
// 市政府
req.money -=20;
next();
});
app.use(function (req,res,next) {
// 區(qū)政府
req.money -= 20;
next();
});
// 錯(cuò)誤處理中間件
app.use(function (err,req,res,next) {
if(err){
console.log(err);
}
});
app.all("/",function (req,res){
console.log(req.money);
res.send(""+req.money);
});
app.listen(7877);
cookie與session
- cookie
安裝cookie-parser模塊
npm install cookie-parser
設(shè)置cookie和獲得cookie
參數(shù):
- expires:cookie的過期時(shí)間渠羞,GMT格式斤贰。如果沒有指定或者設(shè)置為0,則產(chǎn)生新的cookie堵未。
- maxAge:是設(shè)置過去時(shí)間的方便選項(xiàng)腋舌,其為過期時(shí)間到當(dāng)前時(shí)間的毫秒值。
var express = require("express");
var cookieParser = require("cookie-parser");
var app = express();
app.use(cookieParser());
// 設(shè)置cookie
app.get("/setcookie",function (req,res) {
// res.cookie("username","zhangsan",{maxAge:1000*7200});
var nowTime = new Date();
nowTime.setDate(nowTime.getDate()+7);
console.log(nowTime);
res.cookie("username","zhangsan",{expires:nowTime});
res.send("設(shè)置cookie");
});
app.get("/getcookie",function (req,res) {
var username = req.cookies.username;
res.send(`取到的cookie內(nèi)容是${username}`);
})
app.listen(8788);
瀏覽器cookie:
- session
安裝express-session模塊
npm install express-session
session配置:
下面三個(gè)參數(shù)的具體意義:
- secret:"mysecret",
一個(gè)String類型的字符串渗蟹,作為服務(wù)器端生成session的簽名 - resave: false,
(是否允許)當(dāng)客戶端并行發(fā)送多個(gè)請(qǐng)求時(shí)块饺,其中一個(gè)請(qǐng)求在另一個(gè)請(qǐng)求結(jié)束時(shí)對(duì)session進(jìn)行修改覆蓋并保存 - saveUninitialized: true,
初始化session時(shí)是否保存到存儲(chǔ)。默認(rèn)為true雌芽, 但是(后續(xù)版本)有可能默認(rèn)失效授艰,所以最好手動(dòng)添加
var express = require("express");
var session = require("express-session");
var app = express();
app.use(session({
secret:"mysecret",
resave:true,
saveUninitialized:true
}));
session的設(shè)置在瀏覽器中讀取不到,因?yàn)閟ession是存儲(chǔ)在服務(wù)器中的世落。
app.get("/setsession",function (req,res) {
req.session.username = "litiantian";
res.send("session設(shè)置成功");
});
app.get("/getsession",function (req,res) {
var username = req.session.username;
console.log(req.session);
res.send("session內(nèi)容是:"+username);
});
app.listen(8989);
結(jié)束
這是express模塊的api網(wǎng)址:https://www.zybuluo.com/XiangZhou/note/208532
需要調(diào)用什么接口淮腾,可以訪問查看。