express
1.創建方式
- (1)導入express模塊
var express=require('express');
- (2) 調用方法,返回app
var app=express();
- (3)端口監聽 最後執行
app.listen(55555);//異步
- 2.定義方式
- 根據不同的客戶端請求,返回不同的響應
3.app上的方法(app本質:請求監聽函數)
get
app.get('/',function (req, res) {//客戶端通過get方發訪問路由上的時候,會交由對應的回調函數處理 res.end('首頁') });
- head
- delete
- post
- put
- app.all(‘*’)匹配所有的方法名 匹配所有路徑
app.all('*',function (req, res) { res.end('此頁面不存在') });
4.詳細信息的獲取
原理:
var urlObj=require(‘url’).parse(req.url,true);
req.path=urlObj.path;
req.query=urlObj.query;- req.method 請求方法
- req.url 請求URL
- req.path 請求路徑// pathname /food
- req.header 請求頭對象
- req.query 獲取查詢字符串
req.params 獲取請求URL中的參數值
var express=require('express'); var app=express(); app.get('/users/:id',function (req, res) { var values=res.headers.host.split(':'); console.log(values[0]); console.log(values[1]||80); console.log(res.headers.host); res.end('ok'); }); app.listen('8787',function () { console.log('8787'); });
5.中間件
- 中間件都是函數,都需要調用,是爲了傳參(需要參數的原因:靈活傳參 不用固定)
- (1.)使用
var express=require('express'); var app=express(); app.use(function (req,res) {}); app.listen(3200);
- (2)參數
- 參數1:req
- 參數2:res
- 參數3:next -》函數 調用表示繼續向下執行
- (3)特點
- 一般放在路由之前
- 可能有異步代碼
解決方式 通過setTimeOut(function(){ next() //等異步執行完執行next() })
- (4)作用
- 添加公共處理器
- 給請求或響應對象上增加公有的方法和屬性 req.path
- (5)亂碼處理
app.use(function (req,res,next) { res.setHeader('content-type','text/plain;charset=utf8');//dbf 是亂碼 setTimeout(function () { next(); }); });
6.路由中間件
- 根據不同請求實現不同的功能
- 根據不同的路徑請求開頭分別交由各自所屬範圍進行執行
- 引用 創建 執行 發送
user.js var express=require('express'); var router=express.Router(); router.get('/signup',function(req,res){}) module.exports=router 路由中間件部分 var express=require('express'); var app=express(); var user=require('./router/user'); var article=require('./router/article'); /*用戶 /user/sginup */ /*當請求的URL路徑是以user開頭的話,會交由 */ app.use('/user',user); app.use('/article',article); app.listen(7979);
7.send( )
- 特點:對傳入的數據沒有格式限制
- 當參數爲一個String時,ContentType默認設置爲”text/html”
- 當參數爲Array或Object時,Express會返回一個JSON
- 當參數爲一個Number時,並且沒有上面提到的任何一條在響應體裏,Express會幫你
設置一個響應體,比如:200會返回字符”OK”
- 特點:對傳入的數據沒有格式限制
8.static(靜態文件中間件)
- 參數 :靜態文件根目錄
- 查找執行方式
- (1)在根目錄下查找,找到則返回
直接從public文件之下開始查找,會返回一個函數
方式一: app.use(express.static(path.join(__dirname,'public')));
方式二:(1)app.use(express.static(path.resolve('public'))); //-》不寫/user,是全部都可以
(2)app.use('/user',express.static(path.resolve('public'))); //-》只有滿足/user前綴纔可以匹配
- 根目錄下找不到 next向下執行
代碼原理:
function static(root) {
//返回一箇中間件函數
return function (req, res, next) {
//靜態文件根目錄+客戶端請求路徑
var filename=path.join(root,req.path);
fs.exists(filename,function (exist) {
if(exist){
res.sendFile(filename);//發送文件給客戶端
}else{
next();
}
})
}
}
9.tmpl(模板)
- 安裝 npm install ejs
- A.特點
- (1)設置模板引擎相當於設置變量,通過app.get獲取 <%= %>相當於把值放進去
- (2)MVC架構中,模板引擎包含在服務器端
B.模板渲染賦值的方式
- 真正進行模板渲染時,會將所有內容拷貝則res.locals上,然後利用res.locals進行真正的渲染
方式一: res.render('user',{users:users,title:'name'}) 方式二:res.locals.title='name'
- 真正進行模板渲染時,會將所有內容拷貝則res.locals上,然後利用res.locals進行真正的渲染
C.詳細解讀
- 1.參數:
參數1:views 模板相對路徑(相當於模板存放的根目錄)
參數2:數據對象(對象中的屬性可以作爲模板中的JS變量)- 1.參數:
- 2.使用ejs模板
// 指定渲染模板文件的後綴名爲ejs
app.set('view engine','ejs');
app.set('views',path.join(__dirname,'view'));
res.render('index');
修改模板文件的後綴名未HTML
app.set('view engine','html');
//運行ejs模板app.set('views',path.join(__dirname,'views'));
res.render('index');
D.模板引擎
設置模板存放根目錄(views是固定不變的)
app.set('views',path.resolve('xx'));
(1)引用user.ejs文件進行模板渲染
app.set('view engine','ejs');//ejs-》指定的文件擴展名
- (2)引用HTML,以ejs進行渲染
app.engine('html',require('ejs').__express);//模板後綴是HTML的話用ejs的渲染方法進行渲染
注意點
ejs<%%>中的內容,必須要在tmpl.js中存在
html中: <title><%= title %></title> js中: res.render('user',{users,title:'name'})
10.body-parser中間件
- 用於解析客戶端請求的body中的內容,內部使用JSON編碼處理,URL編碼處理及對於wenjian
獲取請求體字符串轉化城對象賦給req.body
true:querystring false :qs app.use(bodyParser.urlencoded({extended:true}));
- 11.頁面跳轉
- res.redirect(‘路徑’)
- location
** 要傳參 res.setHeader('Location','/signin');
NODE (cookie)