nodeJs之express框架學習筆記


先介紹下express:

Express 是一個基于 Node.js 平臺的極簡让蕾、靈活的 web 應用開發(fā)框架,它提供一系列強大的特性结蟋,幫助你創(chuàng)建各種 Web 和移動設備應用脯倚。

放上Express中文官網(wǎng),雖然是中文官網(wǎng)嵌屎,但對于詳細的API翻譯并不完整推正,英文好的同學可以去閱讀一下。至于為什么選擇Express而不是koa宝惰,因為這兩個框架來自同一團隊植榕,在絕大多數(shù)的用法上其實是很相似的,koa有更多的ECMAscript6的語法尼夺,而Express更適合初學者學習尊残。

首先需要安裝Nodejs

Nodejs官網(wǎng)點擊下一步、下一步淤堵,這里不在贅述寝衫,如果成功安裝,點擊開始=>運行=>輸入"cmd"=>輸入node -v就可看到安裝在電腦上的nodeJs的版本號拐邪。

NPM安裝Express

npm會和nodeJs一起安裝慰毅,是一個包管理工具。

npm install express

新建一個app.js

輸入

var express = require('express');
var app = express();
app.get('/',function(req,res){
    res.send('<h1>Hello world!</h1>');
});
app.listen(1234);

這樣一個簡單的例子就寫好了扎阶,在瀏覽器中輸入http://localhost:1234事富,就可看到網(wǎng)頁上的Hello world!

app.get方法

app.get(path,function(req, res));req為請求信息,res為響應信息乘陪。

var express = require('express');
var app = express();
 
app.get('/', function(req, res) {
       res.send('首頁');
});
app.get('/about', function(req, res) {
       res.send('關于');
});

app.listen(1234); 

localhost:1234 會看到首頁,localhost:1234/about 會看到關于雕擂。
上面的get請求返回的是文字啡邑,以下代碼返回文件

var express = require('express');
var app = express();
app.get('/test',function(req,res){
    res.sendfile('test.html');//返回文件
})

若需訪問其他靜態(tài)文件則需以下設置

//根目錄作為靜態(tài)文件訪問目錄 (可訪問根目錄內(nèi)所有文件)
app.use(express.static(path.join(__dirname, '/')));

//根目錄下/src作為靜態(tài)文件訪問目錄 (指定可訪問的文件目錄)訪問地址為localhost:1234/main.css
app.use(express.static('src'));

//我們還可以添加'偽訪問目錄',這樣訪問的地址就是localhost:1234/src/main.css
app.use('/src',express.static('src'));

中間件

中間件是用來處理HTTP請求的函數(shù)(所有的請求都會走中間件)井赌,可以用來完成各種特定的任務谤逼,比如檢查用戶是否登錄贵扰、分析數(shù)據(jù)、以及其他在需要最終將數(shù)據(jù)發(fā)送給用戶之前完成的任務流部。 它最大的特點就是戚绕,一個中間件處理完,可以把相應數(shù)據(jù)再傳遞給下一個中間件枝冀。

app.use(function(request, response, next){
    console.log("第一舞丛!");
    next();//執(zhí)行next(),進入下一個中間件
});

app.use(function(request, response,next){
    console.log("第二!");
});

若在next()中寫入任何參數(shù)next('error')果漾,則代表拋出錯誤球切,程序不再執(zhí)行下去。
app.use()也可以根據(jù)不同的訪問路徑返回不同的內(nèi)容

var express = require("express");
var app = express();
 
app.use(function(req, res, next) {
    if(req.url == "/") {
        res.send("首頁");
    }else {
        next();
    }
});
 
app.use(function(req, res, next) {
    if(req.url == "/about") {
        res.send("關于");
    }else {
        next();
    }
});

app.use(function(req, res) {
    res.send("404!");
});
app.listen(1234);

app.all()

app.all()函數(shù)可以過濾所有路徑的請求
格式:app.all(path,function(req, res));

app.all("*", function(req, res, next) {
    console.log('所有的路徑請求都會走我這里')
    res.writeHead(200, { "Content-Type": "text/html;charset=utf-8" }); //設置響應頭屬性值
    next();
});

query獲取GET請求所帶參數(shù)

假定請求地址為localhost:1234?name=myname

var express = require('express');
var app = express();
 
app.get("/", function(req, res) {
    console.log(req.query.name);//myname
});

app.listen(1234);

param也可獲取參數(shù)

//req.param("name")同樣可以獲得參數(shù)
console.log(req.param("name")); //myname

//不同的是 ‘ param可以獲取不同的路由規(guī)則參數(shù) ’
app.get("/user/:name/", function(req, res) {
    console.log(req.param("name")); //myname
    res.send("使用req.param屬性獲取具有路由規(guī)則的參數(shù)對象值!");
});

params

和param相似绒障,但params是一個可以解析包含著有復雜命名路由規(guī)則的請求對象的屬性吨凑。

app.get("/user/:name/:id", function(req, res) {
    console.log(req.params.name); //"myname"
    console.log(req.params.id); //"123"
});

模版引擎這塊就不寫了,建議前后端分離户辱。

POST請求

格式:app.post(path,function(req, res));
前端代碼:

<script>
var da={data:'testData'};
$.ajax({
    url:'/api',
    type:'POST',
    dataType:'json',
    data:da,
    success:function(data){
        console.log(data);
    }
})
</script>

要想使用body屬性解析post請求參數(shù)值鸵钝,我們需要先安裝和引用body-parser中間件
安裝:

npm install body-parser

使用:

var bodyParser = require('body-parser');
....
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

node代碼:

var express=require('express');
var bodyParser = require('body-parser');
var app=express();

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

//post 請求
app.post('/api',function(req,res){
    res.send( { 'a ' : req.body.data } );
})

app.listen(1234);

請求結果{a,'testData'}

鏈式路由

可使用 app.route()創(chuàng)建路由路徑的鏈式路由句柄。由于路徑在一個地方指定庐镐,這樣做有助于創(chuàng)建模塊化的路由恩商,而且減少了代碼冗余和拼寫錯誤。

app.route('/book')
    .get(function(req, res) { 
        res.send('Get a random book'); 
    }) 
    .post(function(req, res) { 
        res.send('Add a book'); 
    }) 
    .put(function(req, res) { 
        res.send('Update the book'); 
    });

express.Router模塊化路游

路游文件 route.js

var express = require('express');
var router = express.Router();

// 該路由使用的中間件
router.use(function timeLog(req, res, next) {
    console.log('Time: ', Date.now());
    next();
});
// 定義網(wǎng)站主頁的路由
router.get('/', function(req, res) {
    res.send('home page');
});
// 定義 about 頁面的路由
router.get('/about', function(req, res) {
    res.send('About birds');
});
//導出
module.exports = router;

app.js 引入

var express = require('express');
var birds = require('./birds');
...
app.use('/birds', birds);
//應用即可處理發(fā)自 /birds和 /birds/about 的請求焚鹊,并且調(diào)用為該路由指定的 timeLog中間件痕届。

重定向

//網(wǎng)址重定向 例1:使用一個完整的url跳轉(zhuǎn)到一個完全不同的域名。
res.redirect("http://www.hubwiz.com");

//例2:跳轉(zhuǎn)指定頁面末患,比如登陸頁研叫,如下:
res.redirect("login");

express-session

var session = require('express-session');
...
app.use(session({
 secret:'secret',
 resave:true,
 saveUninitialized:false,
 cookie:{
 maxAge:1000*60*10 //過期時間設置(單位毫秒)
 }
}));
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市璧针,隨后出現(xiàn)的幾起案子嚷炉,更是在濱河造成了極大的恐慌,老刑警劉巖探橱,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件申屹,死亡現(xiàn)場離奇詭異,居然都是意外死亡隧膏,警方通過查閱死者的電腦和手機哗讥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胞枕,“玉大人杆煞,你說我怎么就攤上這事。” “怎么了决乎?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵队询,是天一觀的道長。 經(jīng)常有香客問我构诚,道長蚌斩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任范嘱,我火速辦了婚禮送膳,結果婚禮上,老公的妹妹穿的比我還像新娘彤侍。我一直安慰自己肠缨,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布盏阶。 她就那樣靜靜地躺著晒奕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪名斟。 梳的紋絲不亂的頭發(fā)上脑慧,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音砰盐,去河邊找鬼闷袒。 笑死,一個胖子當著我的面吹牛岩梳,可吹牛的內(nèi)容都是我干的囊骤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼冀值,長吁一口氣:“原來是場噩夢啊……” “哼也物!你這毒婦竟也來了?” 一聲冷哼從身側響起列疗,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤滑蚯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后抵栈,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體告材,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年古劲,在試婚紗的時候發(fā)現(xiàn)自己被綠了斥赋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡产艾,死狀恐怖疤剑,靈堂內(nèi)的尸體忽然破棺而出洛波,到底是詐尸還是另有隱情,我是刑警寧澤骚露,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站缚窿,受9級特大地震影響棘幸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜倦零,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一误续、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扫茅,春花似錦蹋嵌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至恋脚,卻和暖如春腺办,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背糟描。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工怀喉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人船响。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓躬拢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親见间。 傳聞我的和親對象是個殘疾皇子聊闯,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容