先介紹下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 //過期時間設置(單位毫秒)
}
}));