express介紹
如有不詳細或者不正確的地方多多指正。
我們可以拿js與jquery關係來類比一下:
jQuery是JS在瀏覽器環境下的封裝庫,把DOM操作,ajax等封裝成了相容性好,方便使用的方法
node是JS的一個非瀏覽器執行平臺,裡面提供API進行web伺服器開發,封裝了node關於web的一些API
兩者有相同之處,express和jQuery都是對自己平臺(node,DOM API)進行了封裝
兩者有不同之處,功能範疇完全不一樣。express開發伺服器,jquery做瀏覽器端操作。
express可以通過官方提供的命令列進行安裝,官方目前預設的介面檔案用jade格式,建議修改為pug格式的檔案(jade版權問題) ,同時要在package.json中安裝對應的npm包和app.js app.set('view engine', 'pug')
設定對應的介面引擎直譯器。
路由
get請求
路由的使用首先要引入express的路由模組,express官網的一個簡單的get請求路由示例
var express = require('express');
var app = express();
// respond with "hello world" when a GET request is made to the homepage
app.get('/', function(req, res) {
res.send('hello world');
});
post請求
post請求首先要引入bodyparse中介軟體,它用於解析客戶端請求中的body中的內容,
使用express應用生成器生成一個網站,它預設已經使用了 bodyParser.json 與 bodyParser.urlencoded 的解析功能,除了這兩個,bodyParser還支援對text、raw的解析。
app.use(bodyParser.json())
bodyParser.json是用來解析json資料格式的app.use(bodyParser.urlencoded({ extended: false }))
bodyParser.urlencoded則是用來解析我們通常的form表單提交的資料,也就是請求頭中包含這樣的資訊: Content-Type: application/x-www-form-urlencoded;
extended:如果設定為false,那麼對URL-encoded的資料的解析採用querystring庫,如果設定為true那麼採用qs庫((querystring和qs的不同))
// home.pug
$.ajax({
url:userPath+"/userinfo-company",
data:{
module:'user',
userId:userId
},
type:"POST",
success:function(res){
alert(res);
},
error:function(error){
console.log(error);
}
});
// index.js
var bodyParser = require('body-parser'); // bodyparser中介軟體
<!--app.use(bodyParser.json());--> // bodyParser.json是用來解析json資料格式的
<!--app.use(bodyParser.urlencoded({ extended: false })); --> // bodyParser.urlencoded則是用來解析我們通常的form表單提交的資料,也就是請求頭中包含這樣的資訊: Content-Type: application/x-www-form-urlencoded
router.post('/userinfo-company', function(req, res, next) {
var module = req.body.module;
var userid = req.body.userId;
request(
{
url: nodeApi + '/menu/getInfo',
method: 'POST',
form: {
module: module,
userId: userid
}
},
function(error,response,body) {
if( response.statusCode == 200 ) {
var tempArr = JSON.parse(body);
}
}
);
})
安全性問題後臺無法讀取到cookie,後面將請求選單的方法放在了js中,然後在將選單傳到路由中,通過res.render進行動態渲染
router.post('/menu', function(req, res, next) {
menuArr = JSON.parse(req.body.menuArr);
res.send('OK');
});
後面發現可以傳遞cookie,但未在專案中使用
預設情況下,cookies是禁用的。在defaults或options將jar設為true,使後續的請求都使用cookie.
var request = request.defaults({jar: true})
request('http://www.google.com', function () {
request('http://images.google.com')
})
通過建立request.jar()的新例項,可以使用定製的cookie,而不是request全域性的cookie jar。
var j = request.jar()
var request = request.defaults({jar:j})
request('http://www.google.com', function () {
request('http://images.google.com')
})
或者
var j = request.jar()
var cookie = request.cookie('your_cookie_here')
j.setCookie(cookie, uri, function (err, cookie){})
request({url: 'http://www.google.com', jar: j}, function () {
request('http://images.google.com')
})
注意,setCookie至少需要三個引數,最後一個是回撥函式。
中介軟體
Express 是一個自身功能極簡,完全是由路由和中介軟體構成一個的web開發框架:從本質上來說,一個 Express 應用就是在呼叫各種中介軟體。中介軟體(Middleware)是一個函式,如果當前中介軟體沒有終結請求-響應迴圈,則必須呼叫next()方法將控制權交給下一個中介軟體,否則請求就會掛起。
中介軟體分為:應用級中介軟體,路由級中介軟體,錯誤處理中介軟體,內建中介軟體,第三方中介軟體。
上面用的bodyParser是應用級的中介軟體,router是路由級的中介軟體,有關中介軟體更詳細的內容參見express官網(express中介軟體)
一些小的注意點
模板引擎前面的縮排要麼是空格或者是tab,如果兩者混用會報錯。
express更改路由中的內容的時候必須要重啟本地伺服器。只需要全域性安裝supervisor,然後命令列supervisor app.js就可以自動重啟。